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
表示空格。
<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个建议