Struts2的一些要点

转自Java 友人帮: 一、Struts2 主要几句话: 1、 Struts2 是由webwork2发展来的而非Struts1,相比Struts1,Struts2编码规范跟类似与webwork2 2、Struts2 非侵入式设计、Struts1属于侵入式设计 3、Struts1与ServletAPI、strutsAPI紧密耦合;Struts1则不 4、Struts2 利用拦截器进行AOP编程,实现如权限拦截功能 5、Struts2 提供了类型转换器 6、Struts2 提供多种表现层技术,如JSP/Freemarker/Velocity等 7、Struts2 的输入验证可以对指定方法进行验证,解决Struts1之痛 8、Struts2 提供了全局范围、包范围和Action范围的国际化资源文件管理实现 二、Struts2 需要的最少jar: Struts-core-2.xx.jar Xwork-2.xx.jar Ognl-2.6.x.jar 对象图导航语言(Object Graph Navigation Language),Struts2通过其读写对象属性 Freemarker-2.3.x.jar Commons-logging.jar Commons-fileupload.jar 切勿全选所以jar,否则你会很痛苦,Struts2提供其他框架的支持,所以依赖其他jar、一些配置文件。 三、环境搭建三部曲: 1. 找到开发Struts2应用需要使用的jar文件 2. 编写Struts2配置文件 3. 在web.xml中加入Struts2MVC框架启动配置 附:2.1.8版本的配置 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 四、Struts.xml配置文件中包的介绍 /page/hello.jsp 管理一组业务功能相关的action,在实际应用中把一组应用功能相关的action放在一个包下 1.name必须,其他包要继承该包,必须经过该属性进行引用 2.namespace定义该包的命名空间,命名空间做为访问该包下action路径的一部分,如上action访问路径为:/test/index.action 3. extends 默认继承了struts-default包,可使这个包下面默认应用了struts2一些新功能,如拦截器等 4.abstract 当 abstract=”true” 则该包内不能有action 五、Struts2里Action名称的搜索顺序 1. 获取请求的URL路径,如下: http://localhost:8080/struts2/path1/path2/path3/helloworld //配置可访问 http://localhost:8080/struts2/path1/path2/path3/as/helloworld //也可访问的 2. 首先寻找namespace为/path1/path2/path3的package,如果不存在这个package则执行步骤3;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找action时就会直接跑到默认namespace的package里面寻找action(默认的命名空间为空字符串””),如果在默认namespace的package里面还寻找不到action,页面提示找不到action 3. 寻找namespace为/path1/path2的package,如果不存在这个package,则转至步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action时就会直接跑到默认namespace的package中寻找名字为test的action,在默认namespace的package里面还寻找不到该action,页面提示找不到action 4. 寻找namespace为/path1的package,如果不存在这个package则执行步骤5;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action时就会直接跑到默认的namespace的package里卖弄去寻找名字为test的action,在默认namespace( )的package里面还寻找不到该action,页面提示不到action 5. 寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,当在package中寻找不得action或者不存在这个package时,都会去默认namespace的package里面寻找action,如果还找不到,页面提示找不到action 六、Action配置中各项默认值 1. 如果没有给action配置class,则默认的是ActionSupport 2. 如果没有给action配置method,则默认的是execute方法 3. 如果没有给result配置name,则默认的是success 例如:可以利用各种默认项的搭配,完成action转发 Struts1: /WEB-INF/page/employeeAdd.jsp Struts2: /WEB-INF/page/employeeAdd.jsp” 同样访问http://localhost:8080/XX/addUI.action 就可访问到employeeAdd.jsp 七、Struts2 中result常用的视图转发类型(dispatcher(默认)、redirect、redirectAction、plainText、chain) 1. dispatcher-转发上面已经介绍了 (1)为缺省的result类型,一般情况下我们在struts.xml会这么写: /main.jsp 以上写法使用了两个默认,其完整的写法为: /maini.jsp 第一个默认:type="dispatcher";第二个默认:设置的为location参数,location只能是页面,不能是另一个action(可用type="chain"解决)。 (2)实现方式 从doExecute方法看出,有三个出口(finalLocation为要跳转的地址): pageContext.include(finalLocation); dispatcher.forward(request, response); (dispatcher是根据finalLocation创建的) dispatcher.include(request, response); 而我们知道,forward与include都是转发到context内部的资源。 2.redirect-重定向 a). /index.jsp b).ognl表达式,在struts.xml中获取action中的变量 /index.jsp?username=${username} http://localhost:8080/struts2/redirect.action 将重定向到如下URL http://localhost:8080/struts2/index.jsp?username=”action中定义的值” 传中文时候请进行编码: username = URLEncoder.encode(“李显武”, “UTF-8”); 注意用get方式传的中文,在页面显示还需要解密: URLDecoder.decode[new String(request.getParameter(“username”).getBytes(“ISO8859-1”), “UTF-8”] 注:action中要提供该变量的getter、setter方法 3. redirectAction-重定向到action(action在同一个包) 注: redirect和redirectAction两种结果类型在使用上其实并没有什么区别,只是写法不同而已。 /WEB-INF/page/hello.jsp helloworld 当action不在同一个包时候 /WEB-INF/page/hello.jsp action名 需要重定向的action所在的包 4. plainText-显示原始文件内容,例如:当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型 /xxx.jsp UTF-8 5. chain-action链 (1)主要用于把相关的几个action连接起来,共同完成一个功能,需要获得上一个action中传下来的值,只需要在下一个action中声明同名的属性 step2.action finish.jsp (2)实现方式: 查看execute()方法,主要思想如下: // 根据Action名称finalActionName及要调用的方法finalMethodName来new一个代理对象proxy,并执行之 proxy = actionProxyFactory.createActionProxy(finalNamespace, finalActionName, finalMethodName, extraContext); proxy.execute(); (3)多个action间数据的传递 主要有两种方式: 1、由于处于chain中的action属于同一个http请求,共享一个ActionContext,故可以在上下文中获取,在页面上可以直接使用。手动获取的方法如下: HttpServletRequest request = ServletActionContext.getRequest(); String s=(String)request.getAttribute("propName"); 2、实现ModelDriven接口 在Step1Action中,加入getModel: public Object getModel() { return message; } 在Step2Action中,加入setModel: public void setModel(Object o){ System.out.println("message is:"+o); } 注意,setModel的调用先于execute()方法后于构造方法。 八、在Struts2中公用的视图 /public.jsp 九、为Action属性注入值 /images /WEB-INF/page/message.jsp 从配置文件将value植入action的属性,再用EL表达式将action的属性值显示出来 注意变量的命名、getter、setter方法 十、指定Struts2处理的请求后缀 默认使用的是处理.action的请求,其实也可以通过常量”struts.action.extension”进行修改,如我们可以配置Struts2只处理以.do为后缀的请求路径: 也可以指定处理多个后缀请求 value之间以”,”分开如: value=”do,action,jhtml” 十一、细说常量的配置 Struts2中常量可以在多个配置文件中配,建议在struts.xml中配置方式如下: 因为常量可以在多个配置文件中进行定义,所以我们需要了解struts2加载常量的搜索顺序: struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml 如果在多个文件中配置了同一个常量,则后一个配置文件中的常量值将会覆盖前面文件中配置的常量值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值