Java Home

Java技术修炼中...
posts - 20, comments - 22, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2006年12月7日

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写

FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件

FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境

FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库

FreeMarker是免费的

1、通用目标

能够生成各种文本:HTML、XML、RTF、Java源代码等等

易于嵌入到你的产品中:轻量级;不需要Servlet环境

插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等

你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器

2、强大的模板语言

所有常用的指令:include、if/elseif/else、循环结构

在模板中创建和改变变量

几乎在任何地方都可以使用复杂表达式来指定值

命名的宏,可以具有位置参数和嵌套内容

名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突

输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换

3、通用数据模型

FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示

你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰

4、为Web准备

在模板语言中内建处理典型Web相关任务(如HTML转义)的结构

能够集成到Model2 Web应用框架中作为JSP的替代

支持JSP标记库

为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员

5、智能的国际化和本地化

字符集智能化(内部使用UNICODE)

数字格式本地化敏感

日期和时间格式本地化敏感

非US字符集可以用作标识(如变量名)

多种不同语言的相同模板

6、强大的XML处理能力

<#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树

在模板中清楚和直觉的访问XML对象模型

posted @ 2007-06-19 08:26 Yemoo'S Java Blog 阅读(491) | 评论 (0)编辑 收藏

当jsp程序出现异常时,往往是直接输出到浏览器页面上的,这样以来,可能使最终用户感到不知所措,也可能因为暴露服务器某些信息而导致服务器的安全性问题。在jsp里我们可以通过制定errorPage="xxx"以使当程序出现错误时转向指定的错误页面,但如果前期没有考虑到这个办法而在系统完成后再去这些工作则工作量可能会很大,好在jsp规范提供了一种简单的解决办法,通过在web.xml中设定全局错误处理页面来对整个项目有效,web.xml中对于不同的http返回结果或异常类型可以有不同的处理方式。
在xml中配置如下:
<error-page>
   <error-code>500</error-code>
   <location>error.jsp</location>
</error-page>
<error-page>
   <error-code>404</error-code>
   <location>notfound.jsp</location>
</error-page>

通过以上配置,程序会自动根据错误类型转向不同的错误页面。

posted @ 2007-06-06 15:59 Yemoo'S Java Blog 阅读(1754) | 评论 (0)编辑 收藏

前段时间作了一个简单的系统,其中涉及到后台管理,当然也就遇到了权限验证的问题,由于初次做J2EE项目,所有这些东西懂我来说都是个开始。
对于权限验证,如果程序由目录划分,如管理员访问的页面都放在admin下,这样我们可以写一个权限验证的过滤器,然后配置admin目录都要经过这个过滤器即可。这样对于jsp页面的权限验证比较容易。但对于action(控制器类)就不好控制了,因为action是没有目录概念的,如我们访问action的地址为:http://xxx/sample/ac1.action,同时如果使用http://xxx/sample/xx/xx/ac1.action同样可以访问,这是因为只要在这个项目目录下,访问的页面如果为action则struts就会去查询这个action名字对应的类,而不管前面的目录结构。因此我们不能再用过滤器对管理员部分的action进行验证。经过查看struts2的相关资料发现了拦截器这个有用的东西。通过struts2的配置文件的包管理功能和拦截器可以轻松的对指定的action做管理(拦截),如
===================================================
<package name="user" extends="struts-default">
  <!-- 前台用户操作部分 -->
  <!-- 框架页,显示分类 -->
  <action name="queryCateForwardUI"
   class="com.topsoft.bookmanage.web.action.QueryCateForwardActionUI">
   <result>/mainPage.jsp</result>
  </action>
    。。。。。
</package>
<!-- 管理员操作部分 -->
 <package name="manager" extends="struts-default">
  <!-- 拦截器 -->
  <interceptors>
   <interceptor name="auth" class="com.topsoft.common.LogonInterceptor" />
   <interceptor-stack name="authStack"> 
                <interceptor-ref name="auth"/> 
                <interceptor-ref name="paramsPrepareParamsStack"/> 
            </interceptor-stack> 
  </interceptors>
  <!-- 默认执行的拦截器 -->
  <default-interceptor-ref name="authStack"/>
  <!-- 全局Action映射 -->
  <global-results>
   <result name="login" type="redirect">/managerLoginUI.action</result>
  </global-results>
  
  <!-- 后台管理首页面UI -->
  <action name="managerIndexUI"
   class="com.topsoft.bookmanage.web.action.ManagerIndexActionUI">
   <result>/admin/index.jsp</result>
  </action>
 。。。。。。
</package>
=================================================

通过使用拦截器+过滤器可以完美解决权限验证的问题。

posted @ 2007-06-06 15:17 Yemoo'S Java Blog 阅读(4966) | 评论 (6)编辑 收藏

struts.action.extension
          The URL extension to use to determine if the request is meant for a Struts action
           用URL扩展名来确定是否这个请求是被用作Struts action,其实也就是设置 action的后缀,例如login.do的'do'字。

struts.configuration
          The org.apache.struts2.config.Configuration implementation class
            org.apache.struts2.config.Configuration接口名

struts.configuration.files
          A list of configuration files automatically loaded by Struts
           struts自动加载的一个配置文件列表

struts.configuration.xml.reload
          Whether to reload the XML configuration or not
           是否加载xml配置(true,false)

struts.continuations.package
           The package containing actions that use Rife continuations
           含有actions的完整连续的package名称

struts.custom.i18n.resources
          Location of additional localization properties files to load
           加载附加的国际化属性文件(不包含.properties后缀)

struts.custom.properties
          Location of additional configuration properties files to load
           加载附加的配置文件的位置


struts.devMode
          Whether Struts is in development mode or not
           是否为struts开发模式

struts.dispatcher.parametersWorkaround
          Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic
            (某些版本的weblogic专用)是否使用一个servlet请求参数工作区(PARAMETERSWORKAROUND)

struts.enable.DynamicMethodInvocation
          Allows one to disable dynamic method invocation from the URL
            允许动态方法调用

struts.freemarker.manager.classname
          The org.apache.struts2.views.freemarker.FreemarkerManager implementation class
           org.apache.struts2.views.freemarker.FreemarkerManager接口名

struts.i18n.encoding
          The encoding to use for localization messages
           国际化信息内码

struts.i18n.reload
          Whether the localization messages should automatically be reloaded
           是否国际化信息自动加载

struts.locale
          The default locale for the Struts application
           默认的国际化地区信息

struts.mapper.class
          The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class
            org.apache.struts2.dispatcher.mapper.ActionMapper接口

struts.multipart.maxSize
          The maximize size of a multipart request (file upload)
           multipart请求信息的最大尺寸(文件上传用)

struts.multipart.parser
          The org.apache.struts2.dispatcher.multipart.MultiPartRequest parser implementation for a multipart request (file upload)
          专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口(文件上传用)


struts.multipart.saveDir
          The directory to use for storing uploaded files
           设置存储上传文件的目录夹

struts.objectFactory
          The com.opensymphony.xwork2.ObjectFactory implementation class
           com.opensymphony.xwork2.ObjectFactory接口(spring)

struts.objectFactory.spring.autoWire
          Whether Spring should autoWire or not
           是否自动绑定Spring

struts.objectFactory.spring.useClassCache
          Whether Spring should use its class cache or not
           是否spring应该使用自身的cache

struts.objectTypeDeterminer
          The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class
            com.opensymphony.xwork2.util.ObjectTypeDeterminer接口

struts.serve.static.browserCache
          If static content served by the Struts filter should set browser caching header properties or not
           是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中

struts.serve.static
          Whether the Struts filter should serve static content or not
           是否struts过滤器应该提供静态内容

struts.tag.altSyntax
          Whether to use the alterative syntax for the tags or not
           是否可以用替代的语法替代tags

struts.ui.templateDir
          The directory containing UI templates
           UI templates的目录夹

struts.ui.theme
          The default UI template theme
           默认的UI template主题

struts.url.http.port
          The HTTP port used by Struts URLs
           设置http端口

struts.url.https.port
          The HTTPS port used by Struts URLs
           设置https端口

struts.url.includeParams
          The default includeParams method to generate Struts URLs
          在url中产生 默认的includeParams


struts.velocity.configfile
          The Velocity configuration file path
           velocity配置文件路径

struts.velocity.contexts
          List of Velocity context names
           velocity的context列表


struts.velocity.manager.classname
          org.apache.struts2.views.velocity.VelocityManager implementation class
           org.apache.struts2.views.velocity.VelocityManager接口名

struts.velocity.toolboxlocation
          The location of the Velocity toolbox
           velocity工具盒的位置
struts.xslt.nocache
          Whether or not XSLT templates should not be cached
           是否XSLT模版应该被缓存

posted @ 2007-05-20 19:05 Yemoo'S Java Blog 阅读(536) | 评论 (0)编辑 收藏

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  建立一个数据源
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName">
   <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
  </property>
  <property name="url">
   <value>jdbc:microsoft:sqlserver://192.168.0.6:1433</value>
  </property>
  <property name="username">
   <value>sa</value>
  </property>
  <property name="password">
   <value></value>
  </property>
 </bean>

  建立会话工厂类,这个类使用spring专门为hibernate3提供LocalSessionFactoryBean
 
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource" />  --引用上面的数据源
  </property>
  <property name="mappingResources">  --调入映射文档
   <list>
    <value>com/yourcompany/User.hbm.xml</value> 
   </list>
  </property>
  <property name="hibernateProperties">  --相关设置
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 </bean>
  

    定义事务管理器,这个也是 spring专门为hibernate3提供的HibernateTransactionManager 事务管理器
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory" />   --引用会话工厂类
  </property>
 </bean>

 定义实体DAO
 <bean id="userDAO" class="com.yourcompany.UserDAOImp">
  <property name="sessionFactory">
   <ref local="sessionFactory" />--引用会话工厂类
  </property>
 </bean>
 

 为上面的实体DAO定义一个代理(proxy)类,这是spring为解决事务问题而提供TransactionProxyFactoryBean动态事务代理类
 <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />  --指定事务管理器(需要是spring专用的)
  </property>
  <property name="target"> --目标实体DAO类
   <ref local="userDAO" />
  </property>
  <property name="transactionAttributes"> --定义要使用事务的方法
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>  --所有insert开头的方法都使用事务,出错要回滚
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> --所有get开头的方法都使用只读事务
    <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>--所有ist开头的方法都使用只读事务
   </props>
  </property>
 </bean>

  为 path="/login" 的struts action 定义实际的action类,该action 已经进行 type="org.springframework.web.struts.DelegatingActionProxy"设置
  <bean name="/login" class="com.yourcompany.struts.action.LoginAction" singleton="false">
    <property name="userDAO">
    <ref bean="userDAOProxy" />  --注意,这里指定的userDAO是上面定义的代理类
  </property>
 </bean>
</beans> 

posted on 2006-12-05 15:40 kelven 阅读(1

posted @ 2007-05-15 08:21 Yemoo'S Java Blog 阅读(410) | 评论 (0)编辑 收藏

今天把jdk从1.6.0卸载后又安装了1.5.04,然后发现netbeans无法启动,提示“Cannot find java.exe...”,在网上看到很多人说要修改环境变量,但是偶的环境变量在安装完jdk后就配置好了,没有问题。
于是又费了老半天的力气,终于解决了,办法如下:
1,启动jdk时 --jdkhome参数指出jdk路径
2,修改netbean目录下的/etc目录下的netbeans.conf中的jdkhome的值为当前jdk路径

使用上面方法中之一即可!

posted @ 2007-03-11 16:54 Yemoo'S Java Blog 阅读(4413) | 评论 (0)编辑 收藏

/**
 *Description:greatest common divisor
 *Author:yemoo 2006.12.06
 
*/

 
public   class  Pt32{
    
// 思路:辗转相除法
      int  divisor1( int  m, int  n){     // 方法一:循环法
          int  temp;
         
if (m < n){     // if m<n,swap m,n
             temp = m;
             m
= n;
             n
= temp;
         }
         
while (m % n != 0 ){
             temp
= n;
             n
= m % n;
             m
= temp;
         }
         
return  n;
     }

     
int  divisor2( int  m, int  n){     // 方法二:递归法
          int  temp;
         
if (m < n){
             temp
= m;
             m
= n;
             n
= temp;
         }
         
return  divisor22(m,n);
     }

    
int  divisor22( int  m, int  n){
        
if (m % n == 0 ){
            
return  n;
        }
else {
            
return  divisor22(n,m % n);
        }
    }

     
public   static   void  main(String args[]){
         KeyboardInput in
= new  KeyboardInput();
         Pt32 obj
= new  Pt32();
         System.out.println(
" input two integer: " );
         
int  a = in.readInt();
         
int  b = in.readInt();
         System.out.println(a
+ " , " + b + " 's greatest common divisor is  " + obj.divisor2(a,b));
     }

 }

使用了辗转相除法,分别使用循环和递归方法实现。

吸取dreamstone大哥的程序写法,发现判断m、n大小的部分可以删除,因为如果m<n求余部分会自动交换两个变量。

改进后程序代码(精简了好多哦):
/**
 *Description:greatest common divisor
 *Author:yemoo 2006.12.07 
*/

 
public class Pt32{
    
//思路:辗转相除法
     int divisor1(int m,int n){    //方法一:循环法
         int temp;
         
while(m%n!=0){
             temp
=n;
             n
=m%n;
             m
=temp;
         }
         
return n;
     }

     
int divisor2(int m,int n){    //方法二:递归法
         if(m%n==0){
            
return n;
        }
else{
            
return divisor2(n,m%n);
        }
     }

     
public static void main(String args[]){
         KeyboardInput in
=new KeyboardInput();
         Pt32 obj
=new Pt32();
         System.out.println(
"input two integer:");
         
int a=in.readInt();
         
int b=in.readInt();
         System.out.println(a
+","+b+"'s greatest common divisor is "+obj.divisor2(a,b));
     }

 }

posted @ 2006-12-07 01:02 Yemoo'S Java Blog 阅读(7751) | 评论 (4)编辑 收藏