个人学习-Struts2

1. Start process
  Runtime rt = Runtime.getRuntime();
   Process pcs = rt.exec(cmd);
   //Perform the operation and return inputstream
   br = new BufferedReader(new InputStreamReader(pcs.getInputStream()));
   pcs.waitFor();


2.处理HTTP请求数据编码:
   默认情况下,IE浏览器发送请求时采用“ISO-8859-1”字符编码,若要正确读取用户发送的中文数据,则需进行编码转换。
   方法一:处理请求前,先设置HttpServletRequest对象的字符编码:
 request.setCharacterEncoding(“gb2312");
   方法二:对用户输入的请求数据进行编码转换:
 String clientData = request.getParameter("clientData");
 if(clientData!=null)
 {
  clientData = new String(clientData.getBytes("ISO-8859-1"),"GB2312");
 }

3.将中文资源文件转换为ASCII:
 先生成临时的中文资源文件,再调用native2ascii命令,生成GB2312编码的中文资源文件
 资源文件的文件名命名格式为:basename_语言代码_国家代码.properties


 
4.WebWork和Struts2的控制器都由两个部分组成:
 — 核心控制器ServletDispatcher,该控制器框架提供。
 — 业务逻辑控制器Action,该控制器由程序员提供。
 
  而Struts1控制器都由两个部分组成:
 — 系统核心控制器:由Struts 1框架提供,就是系统中的ActionServlet。
 — 业务逻辑控制器:由Struts 1框架提供,就是用户自己实现的Action实例。

5.Struts 2的配置文件有两份:

 — 配置Action的struts.xml文件。struts.xml文件内定义了Struts 2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。
 — 配置Struts 2全局属性的struts.properties文件。

6.struts.xml文件的说明:
  对于配置片段:<result name="cancel" type="redirect-action">Welcome</result>

  表示当execute方法返回cancel的字符串时,跳转到Welcome的Action。定义result元素时,可以指定两个属性:type和name。
  其中name指定了execute方法返回的字符串,而type指定转向的资源类型,此处转向的资源可以是JSP,也可以是FreeMarker等,甚至是另一个Action——这也是Struts 2可以支持多种视图技术的原因。

  <struts>

     <!-- Struts 2的Action都必须配置在package里 -->

     <package name="default" extends="struts-default">

     <!-- 定义一个Logon的Action,实现类为lee.Logon -->

        <action name="Logon" class="lee.Logon">

            <!-- 配置Action返回input时转入/pages/Logon.jsp页面 -->

            <result name="input">/pages/Logon.jsp</result>
   ...
  </action>
  ....
 </package>
  </struts>

 
需要配置Action的如下三个部分定义:
 —  Action所处理的URL。
 —  Action组件所对应的实现类。
 —  Action里包含的逻辑视图和物理资源之间的对应关系。
每个Action都要处理一个用户请求,而用户请求总是包含了指定URL。当Filter Dispatcher拦截到用户请求后,根据请求的URL和Action处理URL之间的对应关系来处理转发。

 
7.Struts 2的配置文件:
 — 配置Action的struts.xml文件:
 struts.xml文件内定义了Struts 2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系.
 — 配置Struts 2全局属性的struts.properties文件: struts.properties文件通常放在Web应用的WEB-INF/classes路径下
 例:
 #指定Struts 2处于开发状态
 struts.devMode = false
 //指定当Struts 2配置文件改变后,Web框架是否重新加载Struts 2配置文件
 struts.configuration.xml.reload=true

8.JSP
  &nbsp;表示空格。
  <tr align="center">
    <td colspan="2">
    <input type="submit" value="登录"/>
    <input type="reset" value="重填" />
 </td>
  </tr>

 
9.Struts 2的Action接口
public interface Action
{
 //下面定义了5个字符串常量
    public static final String SUCCESS = "success";
 public static final String NONE = "none";
 public static final String ERROR = "error";
 public static final String INPUT = "input";
 public static final String LOGIN = "login";

 //定义处理用户请求的execute抽象方法
 public String execute() throws Exception;
}
 测试action的方法:.../LoginAction.action
10.实现xwork2.Action需要继承Action的接口。
 //通过ActionContext对象访问Web应用的Session
 ActionContext.getContext().getSession().put("user" , getUsername());
 在jsp中可以${sessionScope.user}访问,无需action

 当Action设置了某个属性值后,Struts 2将这些属性值全部封装在一个叫做struts.valueStack的请求属性里。

11.完成程序国际化
   A.定义国际化资源文件.资源文件的文件名命名格式为:basename_语言代码_国家代码.properties
  利用native2ascii命令(JDK)将转换中文资源文件(非西欧字符->西欧字符) native2ascii messageResouce.properties messageResouce_zh_CN.properties
  并生成英文资源文件
  保存路径为WEB-INF/classes路径(包括struts.xml,struts.properties)
  B.通过全局属性加载资源文件.即在struts.properties中添加
 //定义Struts 2的资源文件的baseName是messageResource
 struts.custom.i18n.resources=messageResource
 若存在WEB-INF/classes/lee路径下,则改为
 struts.custom.i18n.resources=lee.messageResource
  C.Struts 2提供了如下两种方式来输出国际化信息:
 —  <s:text name="messageKey"/>:使用s:text标签来输出国际化信息。
 —  <s:property value="%{getText("messageKey")}"/>:使用表达式方式输出国际化信息。
 在使用UI表单标志时,getText可以用来设置label属性.如:<s:textfield name="name" label="%{getText('UserName')}"/>

 
12.数据校验,两种方法:
   -.在Action中继承ActionSupport类,并重写validate方法
   -.通过配置文件实现校验:ActionName-validation.xml
   <validators>
  <!-- 校验第一个表单域:userName -->
  <field name="userName">
   <field-validator type="requiredstring">
    <message key="用户名不为空"/>
   </field-validator>
  </field>
 </validators>

13.struts.xml中配置action方法:
 -默认调用Action中的execute()方法
 -调用自定义方法,则需要添加属性method=“MethodName”
 
 
14.JSP文件中:<s:form action="Login" method="POST">       表示表单中的数据可以引用action中的属性。
 struts.xml文件中: <action name="Login" class="tutorial.Login">
       <result>/HelloWorld.jsp</result>
      </action>
 表示跳转的jsp文件,并且可以引用action中的属性

 

15. 要取得Servlet API中的一些对象,如request、response或session等,在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式。
 A.非IoC方式
 要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。 另外,org.apache.struts2.ServletActionContext作为辅助类
 (Helper Class),可以帮助您快捷地获得这几个对象。
      HttpServletRequest request = ServletActionContext.getRequest();
      HttpServletResponse response = ServletActionContext.getResponse();
      HttpSession session = request.getSession();
 如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象。

 B.IoC方式
 要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。


 
16. 许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在Struts 2.0中,我们通过以下两种方法做到这点:
 A. 在资源文件的国际化字符串中使用OGNL,格式为${表达式},例如:
    validation.require=${getText(fileName)} is required

 B. 使用java.text.MessageFormat中的字符串格式,格式为{ 参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式},例如:
    validation.between=Date must between {0, date, short} and {1, date, short}

   
 在显示这些国际化字符时,同样有两种方法设置参数的值:
 A. 使用标志的value0、value1...valueN的属性,如:
  <s:text name="validation.required" value0="User Name"/>

 B. 使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中
  <s:text name="validation.required">
   <s:param value="User Name"/>
  </s:text>

17. 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。拦截器是动态拦截Action调用的对象
 它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。


 
 
***Struts 2确实在Struts 1上做出了巨大的改进,的确是一个非常具有实用价值的MVC框架。下面是Struts 1和Struts 2在各方面的简要对比。
 — 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,
   使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。
 — 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。
   Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
 —  Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依赖于Servlet API,
    从而允许Action脱离Web容器运行,从而降低了测试Action的难度。 当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。
    但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。
 — 可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:
   Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action类。Struts 2 Action可以通过初始化、设置
   属性、调用方法来测试。
 — 封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类
   封装用户请求参数。虽然Struts 1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发
   ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts 1 ActionForm的模式,Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户
   请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO,从而降低了代码污染。
 — 表达式语言方面的对比:Struts 1整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2可以使用JSTL,但它整合了一种更强大和
   灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式语言功能更加强大。
 — 绑定值到视图的对比:Struts 1使用标准JSP机制把对象绑定到视图页面;Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
 — 类型转换的对比:Struts 1 ActionForm 属性通常都是String类型。Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2使用OGNL进行类型转换,支持基本数据类型
   和常用对象之间的转换。
 — 数据校验的对比:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。
 —  Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action
   创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。

 


**web.xml中配置FilterDispatcher的代码片段如下:

      <!-- 配置Struts 2框架的核心Filter -->
       <filter>
                                 <!-- 配置Struts 2核心Filter的名字 -->
                                 <filter-name>struts</filter-name>
        
                                 <!-- 配置Struts 2核心Filter的实现类 -->
                                  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
                                  <init-param>
                                    <!-- 配置Struts 2框架默认加载的Action包结构 -->
                                     <param-name>actionPackages</param-name>
                                  <param-value>org.apache.struts2.showcase.person</param-value>
                                 </init-param>
        
                                 <!-- 配置Struts 2框架的配置提供者类 -->
                                  <init-param>
                                     <param-name>configProviders </param-name>
                                  <param-value>lee.MyConfigurationProvider</param-value>
                                 </init-param>
       </filter>

 个初始化参数有特殊意义:
 —  config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts 2框架将自动加载该属性指定的系列配置文件。
 —  actionPackages:该参数的值也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts 2框架将扫描这些包空间下的Action类。
 —  configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该

**struts.xml的配置
 管理struts.xml配置文件:1.可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。在struts.xml中添加:<include file="struts-part1.xml" />

 
** struts.properties配置文件
 1.struts.i18n.encoding:指定Web应用的默认编码集。该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312。
 2.struts.devMode:该属性设置Struts 2应用是否使用开发模式。
 3.struts.i18n.reload:该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。
 4.struts.custom.i18n.resources:该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
 5.struts.configuration.files:该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。
   该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。
开发者不喜欢使用额外的struts.properties文件,Struts 2允许在struts.xml文件中管理Struts 2属性,在struts.xml文件中通过配置constant元素

 

 

**Struts 2.0常用的校验了,以下在jar的default.xml中的注册的校验器。

< validators >
    < validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />
    < validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" />
    < validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" />
    < validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" />
    < validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" />
    < validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />
    < validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" />
    < validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" />
    < validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" />
    < validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" />
    < validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" />
    < validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" />
    < validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" />
</ validators >

 

学习教材:实战突击:Java Web项目整合开发   编写高质量代码:改善Java程序的151个建议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值