struts2框架

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts2
1.Struts2介绍
Struts2是Apache发行的MVC开源框架。

Struts2是在Struts1框架的基础上融合了WebWork优秀框架升级得到的。

在MVC流程框架中充当控制器角色。

M:model-----数据封装------->javabean(Hibernate、MyBatis)
V:view------视图----------->jsp(JSTL+EL)
C:control------控制器--------> struts2( filter)
2.开发第一个Hello word
2.1导包
1)struts2-core-2.x.x.jar :Struts 2框架的核心类库
2)xwork-2.x.x.jar :XWork类库,Struts 2在其上构建
3)ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),Struts 2框架使
用的一种表达式语言
4)freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写
5)commons-logging-1.1.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持
Log4J和JDK 1.4+的日志记录。

6)Commons-fileupload 拷进去
2.2 配置struts 的核心过滤器
2.3 struts.xml文件
2.4 编写Action
2.5 编写JSP页面
3.在Struts.xml配置Action 3.1 默认值
3.2 result跳转类型
4.指定需要Struts 2处理的请求后缀
5.指定多个配置文件
6.为Action的属性注入值
7.动态方法调用与通配符调用7.1 动态方法调用
7.2 通配符调用
8.全局跳转与常量8.1 全局跳转
8.2 定义常量
8.3 常用的常量
9.文件上传
10.访问或添加request/session/application属性
11.自定义拦截器
12.OGNL表达式语言与Struts2标签12.1 OGNL表达式
12.2 Struts2标签
<Result/>标签
Name=”success”默认
type="dispatcher" 等价 request.getRequestDispatcher()
<result type="dispatcher">/WEB-INF/jsp/message.jsp</result>
type="redirect" 等价 response.sendRedirectr()
<result type="redirect">/WEB-INF/jsp/message.jsp</result>
<!-- 重新执行那个命名空间下那个 action -->
<result type="redirectAction">
<param name="namespace">/reg</param>
<param name="actionName">regAction</param>
</result
<package name="reg" namespace="/reg" extends="struts-default">
<action name="regAction"
class="com.struts.hello.action.RegAction">
<result>/WEB-INF/jsp/message.jsp</result>
</action>
</package>
属性注入
<param name="message">message属性注入</param>
类似el表达式 ${message}(获取action中 message属性值)
<result>/WEB-INF/jsp/message.jsp?abc=${message}</result>
Bbs论坛:
日期: 2012-11-10
Struts2的处理流程:
指定多个配置文件:
在大部分应用里,随着应用规模的增加,系统中Action数量也大量增加,导致struts.xml配置文件变得非常臃肿。

为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。

下面的struts.xml通过<include>元素指定多个配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>
通过这种方式,我们就可以将Struts 2的Action按模块配置在多个配置文件中。

为Action的属性注入值:
public class HelloWorldAction{
private String savePath;
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
......
}
<package name="test" namespace="/test" extends="struts-default">
<action name="helloworld" class="cn.action.HelloWorldAction" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
上面通过<param>节点为action的savePath属性注入“/images”
动态方法调用:
如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法
通常不建议大家使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用。

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
使用通配符定义action:
<package name="test" namespace="/test" extends="struts-default">
<action name="helloworld_*" class="cn.action.HelloWorldAction" method="{1}"> <result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
public class HelloWorldAction{
private String message;
....
public String execute() throws Exception{
this.message = "我的第一个struts2应用";
return "success";
}
public String other() throws Exception{
this.message = "第二个方法";
return "success";
}
}
要访问other()方法,可以通过这样的URL访问:/test/helloworld_other.action
全局结果:
当多个action中都使用到了相同result,这时我们应该把result定义为全局结果。

<package ....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
定义常量:
struts2按如下搜索顺序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
#指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出
struts.i18n.encoding=utf-8
#设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭struts.serve.static.browserCache=false
#当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
struts.configuration.xml.reload=true
#开发模式下使用,这样可以打印出更详细的错误信息
struts.devMode=true
#该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。

如果需要关闭动态方法调用,则可设置该属性为false
#struts.enable.DynamicMethodInvocation=false
#文件上传设置文件最大为多少默认2M
struts.multipart.maxSize=10701096
#该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action 的请求都由Struts2处理。

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

struts.action.extension=do,action,go
#与spring集成时,指定由spring负责action对象的创建
#struts.objectFactory=spring
#默认的视图主题
struts.ui.theme=simple
日期: 2012-11-12
自定义类型转换器:
action中使用到了时间类型Date,当需要将请求参数注入到date属性时,我们必须定义转换器,否则struts2无法自动完成类型转换。

(为了测试类型转换器默认情况下date=2010-01-29 是可以转换的但是 date=20100129 这就不行会到页面输出原样值(action从缓存中得到的) 控制台出错)
下面定义了一个针对Date类型的类型转换器:
1.
public class DateTypeConverter extends DefaultTypeConverter {
/**
*value表示前台提交表单name对应的value值
*例如:<input name="date" value="2012-12-12"/>
*注意:value是数组
*toType:表示action中属性的类型
*private Date date;java.util.Date
*/
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss");
if(toType==Date.class)// 判断action 中的date属性是否是 Date类型
{
// request.getParameter("date")
// request.getParameterValue("date") 要兼容 <input
type="checkbox"/>
Object[] params= (Object[])value;
try {
return sdf.parse(params[0].toString());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
2.将上面的类型转换器注册为局部类型转换器:
在Action类所在的包下放置ActionClassName-conversion.properties文件,ActionClassName 是Action的类名,后面的-conversion.properties是固定写法,对于本例而言,文件的名称应为HelloWorldAction-conversion.properties 。

在properties文件中的内容为:
属性名称=类型转换器的全类名
对于本例而言,HelloWorldAction-conversion.properties文件中的内容为:
date= com.struts2.web.util.DateTypeConvert
3 全局类型转换器
将上面的类型转换器注册为全局类型转换器:
在src下放置xwork-conversion.properties文件。

在properties文件中的内容为:
待转换的类型=类型转换器的全类名
对于本例而言,xwork-conversion.properties文件中的内容为:
java.util.Date=com.struts2.web.util.DateTypeConvert
(全局类型转换器针对全部的Action中的时间类型所以不能把Action中字段名做为key 值要以时间类型做为key)
自定义拦截器:
例子: 用户没有登录不允许回复帖子
1.自定义拦截器:
public class PermissionInterceptor implements Interceptor {
public void destroy() {
// TODO Auto-generated method stub
}
public void init() {
// TODO Auto-generated method stub
}
public String intercept(ActionInvocation invocation) throws Exception {
User user= (User)
ActionContext.getContext().getSession().get("user");
if(user==null)
{
return"login";
}
return invocation.invoke();// 执行目标方法
}
}
2.为Action 注册拦截器
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="permissionInterceptor"
class="com.struts.bbs.util.PermissionInterceptor"></interceptor>
<!-- 配置拦截器栈 (注意:系统+自定义) -->
<interceptor-stack name="permissionStack">
<interceptor-ref
name="permissionInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="toAddReplyAction"
class="com.struts.bbs.reply.action.ReplyAction" method="toAddReply">
<result name="login">login.jsp</result>
<result>/WEB-INF/jsp/reply_post.jsp</result>
<interceptor-ref name="permissionStack"></interceptor-ref> </action>
输入校验:
1.action 继承ActionSupport
2.重写ActionSupport的Validate()
/**
*这个方法是针对action中所有方法进行校验
*/
public void validate() {
if(user!=null)
{
if(user.getUname()==null||user.getUname().trim().equals(""))
{
this.addFieldError("userName", "用户名不能为空");
}
if(user.getUpass()==null||
user.getUpass().trim().equals(""))
{
this.addFieldError("password", "密码不能为空");
}
}
}
校验失败返回默认为 input试图
如果针对单个方法进行校验
方法名称 : validate+方法名称(注意方法名称首字母大写)
例如:
public void validateLogin()// 针对login方法进行校验
{
if(user!=null)
{
if(user.getUname()==null||user.getUname().trim().equals(""))
{
this.addFieldError("userName", "用户名不能为空");
}
if(user.getUpass()==null||
user.getUpass().trim().equals(""))
{
this.addFieldError("password", "密码不能为空");
}
}
}
配置全局资源与输出国际化信息:
Src 下创建:
login_zh_CN.properties
login_en_US.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java 支持的语言和国家。

如:
中国大陆:baseName_zh_CN.properties
美国:baseName_en_US.properties
对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。

命令的使用方式如下:
native2ascii 源文件.properties 目标文件.properties
使用上面的资源文件,在struts.xml中使用常量加载全局资源文件如下:
<constant name="struts.custom.i18n.resources" value="login" />
login为资源文件的基本名。

●在JSP页面中使用<s:text name=“”/>标签输出国际化信息:
<s:text name=“user”/>,name为属性文件中的key
●在Action类中,可以继承ActionSupport,使用getText()方法,该方法的第一个参
数用于指定属性文件中的key。

●在表单标签中,通过key属性指定属性文件中的key,如:
<s:textfield name="realname" key="user"/>
国际化—包范围资源文件:
在一个大型应用中,整个应用有大量的内容需要实现国际化,我们可以针对不同模块、不同的action来组织国际化文件。

在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。

当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources 指定的资源文件中寻找。

<s:i18n name="cn/struts2/natives/action/package">
<s:text name="helloWorld"></s:text>
</s:i18n>
国际化—Action范围资源文件:
我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。

当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查基本名为package 的资源文件,一直找到最顶层包。

如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找。

例如:
<s:i18n name=”cn/struts2/acion/LoginAction”>
</s:i18n>
OGNL表达式语言:
注意:
1.值栈:Action中属性的值是放在值栈中
使用struts标签不需要加上#
2 放入request ,session application
使用struts标签需要加上#
Struts2 标签。

相关文档
最新文档