struts2升级
学习struts2——常见问题与处理

学习struts2.2.1遭遇滑铁卢~~~~~好多异常~~~~~好多bug~~~~好多问题~~~~~~好多困难~~~好多肥羊~~~一、Filter mapping specifies an unknown filter name ----filter标签在web.xml 里的顺序<filter-mapping><filter-name>adminOperateLogFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>adminOperateLogFilter</filter-name><filter-class>com.berheley.exam.web.filter.AdminOperateLogFil ter</filter-class></filter>这样写启动服务器时报错 Filter mapping specifies an unknown filter nameadminOperateLogFilter将这两块换个顺序就没问题了,web.xml信息的加载是有顺序的,filter在mapping之前必须要让服务器找到其定义。
<filter><filter-name>adminOperateLogFilter</filter-name><filter-class>com.berheley.exam.web.filter.AdminOperateLogFil ter</filter-class></filter><filter-mapping><filter-name>adminOperateLogFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>二、ng.IllegalArgumentException: Filter mapping specifies an unknown filter nameStruts2答:“Struts2”?大写的?are you sure?我猜你一定是看了某struts2.0的权威指南(那是一个chm文件电子书,而且你看的可能是翻译成中文的),我不知道英文版的有没有写错,但是我检查了很久后才发现中文版存在这个大小写错误。
struts2

1.strust2框架来历简介:WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。
(同时也是一个成熟的基于Web的MVC框架)MVC:Model View Controller,model是模型,view是视图,controller是控制器,是一种框架模式。
随着WebWork框架的发展,衍生出了strust2框架,因此strust2框架是WebWork的升级,而不是一个全新的框架,因此稳点性、性能等方面都有很好的保证,而且也同时吸收了struts1框架和WebWork俩者的优点.所以strust2框架也是一个基于Web的MVC框架注意:strust2框架并不是struts1框架的延续或者升级,俩者有着很大的不同2.web项目中的三层架构(和MVC是俩个完全不同的架构)1.表示层(Struts2框架就是工作在这个地方)2.业务逻辑层(service层,处理业务逻辑,比如判断用户名是否存在、密码是否正确、权限是否拥有、账号是否被冻结、账号是否异常、用户积分是否到达操作要求等等,多为一些执行某一个操作条件的判断)3.数据访问层(dao层,专门处理和数据库进行交换的事情,jdbc/hibernate就在这里使用)在项目中,这些不同的分层的表现形式,其实就是在我们自己建的不同的package 中写上各自分层中所使用的java类.比如在项目中我们建了三个package,三个package中java类的作用分别为表示层的代码、业务逻辑层代码、数据访问层代码。
注意:可以理解为,MVC架构是这里说描述的三层架构的一部分,即:三层架构中的表示层可以使用mvc架构的框架来实现,例如使用struts2框架.3.使用struts2框架的好处(为什么要使用struts2框架)减少编程人员代码的编写,使代码更加简洁明了,缩短开发时间,增加开发效率.4.struts2框架引入到web项目中首先使用Eclipse/MyEclipse中建一个web项目.1.把struts2相关jar包引入到项目中。
struct2

Struts2相关Struts2是一个按照MVC模式设计的web层框架,其实Struts2就是一个大大的filter,我们可以在web.xml文件中讲符合某种特征的所有请求交给这个filter处理,这个filter再参照一个配置文件(通常为/WEB-INF/classes/struts.xml)将各个请求分别分配给不同的action去处理!Struts2的核心FilterDispatcher, 从2.1.3版本开始, 换成了StrutsPrepareAndExecuteFilter. 官方为什么要做这个升级呢?首先看下官方给的Struts2工作原理图:Struts2工作原理(基于看完上图的理解):当一个HttpServletRequest请求来了,先经过ActionContextCleanUp过滤器,清除Action环境,再经过其他的过滤器,例如说SiteMesh和用户自定义过滤器等等, 最后到达Struts2的核心过滤器StrutsPrepareAndExecuteFilter,此时,StrutsPrepareAndExecuteFilter会去找ActionMapping看此Action路径是否存在,如果存在,则会参照Struts.xml文件产生Action的代理,并且执行Action,Struts2很多功能是靠拦截器完成的,所以这个Action代理真正调用Action的处理请求的方法的时候会经过拦截器1,2,3,才真正调用Action的方法,Action方法结束后会返回一个视图,视图也会去参照ActionMapping,还会参照Template(JSP,FreeMarker),此时,拦截器会再次拦截(说明Struts2的拦截器是进入Action和返回结果的时候都会拦截的,这比Filter好!),最后产生HttpServletResponse,相应结果!我们也看到了, 老版本上面, 我们需要的别的过滤器全部要放在Struts2的过滤器之前. 但是我现在有个需求: 我想在我的过滤器里面做一些事,需要Struts2的环境(ActionContext), 但是又需要在Struts2的Action执行之前. 这个时候, 老版本的那个过滤器就只能两眼望青天了.打个比方, 好比一个病人要做手术, 做手术需要打麻药(自定义过滤器)和动手术(Struts2的过滤器), 请问打麻药要怎么打呢? 不能让病人站着吧.. 所以首先要准备一个床(ActionContext), 之后打麻药, 再手术. 这也就是StrutsPrepareAndExecuteFilter真正的含义. 可以分成StrutsPrepareFilter,StrutsExecuteFilter, 如果没有像之前那样的需求,我们一般都用StrutsPrepareAndExecuteFilter就可以了.。
strusts2课堂总结

一、1、struts2struts2是mvc设计思想的一个实现,可以将项目低耦合,提高扩展性2、struts2和struts1的区别struts2不是struts1的升级,而是继承的下xwork的血统,它吸收了struts1和webwork 的优势。
struts2的action是原型,安全的,struts2的action是单例,非安全3、步骤:1、导入包2、在web.xml文件中,加入struts2的核心拦截器3、在src下放入struts2的xml struts.xml4、urlhttp://localhost:8080/Struts2_01_HelloWorld/demo/hello.action二、1、默认值2、转发和重定向的区别转发:url显示的依然是上一个的url,共享上一次的请求重定向:url显示的是下一个的url,不共享3、urlhttp://localhost:8080/Struts2_02_Default/demo/hello.action4、路径http://localhost:8080/Struts2_02_Default/demo/a/b/c/hello.action1、原路径找不到,http://localhost:8080/Struts2_02_Default/demo/a/b/hello.action2、如果1找不到,http://localhost:8080/Struts2_02_Default/demo/a/hello.action3、如果2找不到,http://localhost:8080/Struts2_02_Default/demo/hello.action3、如果3找不到,http://localhost:8080/Struts2_02_Default/hello.action三、11、自定义action继承ActionSupport2、功能方法必须满足格式public String 名字()throws Exception{....};3、urlhttp://localhost:8080/Struts2_03_Action/demo/a.action四、1、如何给action传入参数注意:赋值的必须有封装的set方法,通过el表达式获取的时候,必须有封装的get 方法1、直接给单个参数赋值,在action里建立一个变量,名字与参数的名字一样2、为对象的某个属性赋值,在action里建立一个对象,将参数改为对象名.属性的格式五、1、转发和重定向的区别转发到下一次的时候,url依然是上一次的url,共享上一次的request重定向到下一次的时候,url是下一次的url,不共享上一次的request2、struts2的result的type转发:共享上一次action重定向:不共享上一次action1、转发到下一个jsp,html:dispatcher2、重定向到下一个jsp,html:redirect3、转发到下一个action:chain转到同一个包下的action转发到不同包下的action4、重定向到下一个action:redirectAction转到同一个包下的action转发到不同包下的action六、1、为了分模块开发,可以设置多个xmL文件。
Struts1与struts2的区别总结

Struts1与struts2的区别总结1,背景:Struts2并不是struts1的升级版,两者没有太大的关系,struts2是继承了webwork的机制,吸收了struts2和webwork的有优势。
Struts2是基于WebWork的一个全新框架. Struts2主要改进是取代了Struts1的Servlet和Action. Struts2的核心框架是当作一个filter来实现其功能的,而Struts1是ActionServlet.然后在Action上,Struts1都少不了要传递Request等参数,还要继承Action父类,而Struts2只要实现了一个public String execute()就可以了,这样Action就可以实现脱离Servlet 测试. Struts2还提供了拦截器(Interceptot)等Struts1所没有的技术.2,Action类Struts1要求action继承一个抽象基类,而struts2既可以继承类又可以实现action对应的接口,即接口编程,可以实现多个接口,使得可选和订制服务成为可能。
3,线程模式Struts1中的action是单例模式,会涉及到线程安全问题,因为仅有一个action来处理所有的请求,而struts2则是非单例模式,每个请求对应一个action,这样就不用考虑线程安全的问题(而且,servlet容器会给每个请求产生可丢弃的对象,这样就不会导致性能和垃圾回收问题)。
4,可测性Struts1中的action有个主要的问题是execute方法暴露了servlet API,这使得测试等需要依赖servlet容器。
一个第三方扩展--struts TestCase--提供了一套struts模拟对象来进行测试;而struts2 中的action可以通过初始化和设置属性(例如action当中直接用get和set方法),调用方法来测试,“依赖式注入”注入也使得测试更容易5,servlet依赖Struts1中的action依赖于servlet API,因为当一个action被调用时,HttpServletRequest和HttpServletResponse对象会被传递给execute方法(请求和响应的对象需要依赖于execute方法,即servlet API);而struts2中的action则不需要依赖于servlet容器,允许action脱离容器单独被测试(例如:struts2中获取请求的对象可以用ServletActionContext.getRequest())。
Struts2S2-020漏洞介绍

Struts2 S2-020漏洞简介1.漏洞概述今年二月初,Apache Tomcat项目组委员会成员Mark Thomas提到CVE-2014-0050漏洞本是通过JPCERT上报给Apache软件基金会,但是由于处理邮件失误,导致漏洞细节泄露,使得这个问题提前曝光。
随后在三月,Apache 官方公布了S2-020漏洞公告,公告里简要描述了该漏洞形成的原因和临时解决方案。
在官方这个通告公布的一段时间后,各大厂商已经采取了相应的安全措施去解决或预防这个漏洞。
但在不久之后,在SecurityFocus、Spiderlabs等安全网站上又披露了CVE-2014-0094漏洞修补方案本身存在漏洞,导致补丁被完全绕过,造成更大的危害。
近日,官方在GitHub上已经对该问题做出了修正,但随后发现该修正方案也可绕过。
2.漏洞危害官方在S2-020漏洞公告里介绍了两种漏洞(CVE-2014-0050、CVE-2014-0094):一是通过Commons-fileupload造成的拒绝服务攻击;另一个是附加的ParametersInterceptor允许访问'class' 参数(该参数直接映射到getClass()函数),并允许控制ClassLoader。
例如,给当前应用目录赋值地址映射目录是攻击者可控的目录时,攻击者便可轻易地执行预先设置好的代码;另一个危害是给当前应用目录赋值一个不存在的地址(class.classLoader.resources.dirContext.docBase=不存在路径)会导致应用404,这样当前应用,以后不管访问哪个地址都是404了(因为映射的目录不存在),造成DoS效果。
近日安全研究人员发现Apache Struts2 S2-020,在CVE-2014-0094的漏洞修补方案中存在漏洞,漏洞补丁存在被绕过的风险,可能导致执行任意代码。
3.解决方案官方解决方案:升级struts版本到2.3.16.1。
基于Web项目开发中的Struts2技术探讨

、
MV C设计模 式
MV C设计模式是 至今用得 比较多 的一种设计模式 , 是最早 的许多缺点 ,并 以 We Wok为核心 ,采用 WeWok的设计理 b r b r 。 tt r 2 t s 的升级版 , u 而是兼容 了 Srt1 t s 和 u 出现在 S a a ml l h k中, 后来广泛用于 Jv b应用程序 中。M dl 念.因此 S us 并不是 Srt1 aa We oe ( 模型 ) 表示业 务逻辑层 , i ( 图 ) 表表示层 , ot l r控 WeWok Ve 视 w 代 C nr l ( oe b r 两个框架 ,t t S us 以下优势 : r 2有 制器 ) 表控制层 。如 图 1 代 所示 :
4 易测性 、
图 1MV C设计模式图
Srt t s A t n 以通过初始化 、设置属性和调用 方法来 u 2的 ci 可 o 3控制( otlr部分 由 Sre组成 。 、 Cn oe) rl el vt 当用户请求从 Ve 测试 。依赖 注入 的支持也使测试 变得更简单。 i w 部分传过 来时 ,otlr Cn oe 把该请求发给适 当的业 务组 件 ;请求 rl 5 捕获输入 、
Jv aa We b
良好 的层 次划分 , 同时也提供 了一系列工具来简化应用的开发 。
关 键 词 Srt2 t s u
中图分类号 T 3 1 P 1
文献标识码
A
文章编号 1 0 1 5 3 1 3— 9 8 1
Srt e h oo yB s do eWe rjc e e p n t s T c n lg a e nt bPoe t v l me t u2 h D o
g o i r r h c l iiin a d S r t2h ss r s o l i l yt ed v lp n f p l ai n o d h e a c ia v so , n tu s a e i ost smp i e e o me t p i t . d e t o f h oa c o
使用struts2、数据库、JSP实现增、删、改、查源码

Action 包下面的class文件:package action;import erDao;import erDaoImp;import er;public class UserAction {private User user;public String add(){UserDao userDao = new UserDaoImp();try {userDao.save(user);return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String update(){UserDao userDao = new UserDaoImp();try {userDao.updata(user);System.out.print("----");return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String delete(){UserDao userDao = new UserDaoImp();try {userDao.deleteById(user.getId());return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String show(){UserDao userDao = new UserDaoImp();try {user = userDao.findById(user.getId());return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public User getUser() {return user;}public void setUser(User user) {er = user;}}package action;import java.util.List;import erDao;import erDaoImp;import er;public class UserListAction {private List<User> users;public List<User> getUsers() {return users;}public void setUsers(List<User> users) { ers = users;}public String execute(){UserDao userDao = new UserDaoImp();try {users = userDao.findAll();return"success";} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return"error";}}}Dao 下面的class文件package dao;import java.util.List;import er;public interface UserDao {public void save(User user) throws Exception;public void updata(User user) throws Exception;public void deleteById(int id) throws Exception;public User findById(int id) throws Exception;public List<User> findAll() throws Exception;}Daoimpl包下面的class文件package daoimp;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import util.DBUtil;import erDao;import er;public class UserDaoImp implements UserDao {static final String insert = "insert into t_user(username,pwd,age) values(?,?,?)";static final String findAll = "select * from t_user";static final String delete = "delete from t_user where id=?";static final String findById = "select * from t_user where id=?";static final String update = "update t_user set username=?,pwd=?,age=? where id=?";public List<User> findAll() throws Exception {Connection con = DBUtil.getConnection();PreparedStatement pst = con.prepareStatement(findAll);ResultSet rs = pst.executeQuery();List<User> users = new ArrayList<User>();while(rs.next()){User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("pwd"));user.setAge(rs.getInt("age"));users.add(user);}con.close();return users;}public User findById(int id) throws Exception {Connection con = DBUtil.getConnection();PreparedStatement pst = con.prepareStatement(findById);pst.setInt(1, id);ResultSet rs = pst.executeQuery();if(rs.next()){User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("pwd"));user.setAge(rs.getInt("age"));return user;}DBUtil.close(con);return null;}@Overridepublic void deleteById(int id) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(delete);pstmt.setInt(1, id);pstmt.executeUpdate();con.close();}@Overridepublic void save(User user) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(insert);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setInt(3, user.getAge());pstmt.executeUpdate();con.close();}@Overridepublic void updata(User user) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(update);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setInt(3, user.getAge());pstmt.setInt(4, user.getId());pstmt.executeUpdate();con.close();}}实体层entity包下面的class文件:package entity;public class User {private int id;private String username;private String password;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}JSP文件:Add.jsp<body><form action="add.action"method="post"><table border="1"align="center"><tr><td>UserName:</td><td><input type="text"name="ername"></td> </tr><tr><td>PassWord:</td><td><input type="password"name="user.password"></td> </tr><tr><td>Age:</td><td><input type="text"name="user.age"></td></tr><tr align="center"><td colspan="2"><input type="submit"value="添加"><a href="list.action">查看用户列表</a></td></tr></table></form><!--<h1>添加</h1><form action="add.action" method="post">用户名:<input type="text" name="ername"><br/>密 码:<input type="password" name="user.pwd"><br/> name="user.pwd"><br/>年 龄:<input type="text" name="user.age"><br/><input type="submit" value="添加"><a href="list.action">查看用户列表</a></form>--></body>Error.jsp<body><h1>系统错误!请稍候重试....!</h1><br></body>List.jsp<body><table border="1"align="center"><tr><th>ID:</th><th>UserName:</th><th>Age:</th><th>相关操作</th></tr><s:iterator value="users"><!-- 遍历 value是集合的对象 --> <tr><td><s:property value="id"/></td><td><s:property value="username"/></td><td><s:property value="age"/></td><td><a href='delete.action?user.id=<s:property value="id"/>'>删除</a><a href='show.action?user.id=<s:property value="id"/>'>查看</a><a href='update_init.action?user.id=<s:property value="id"/>'>修改</a></td></tr></s:iterator><tr align="center"><td colspan="4"><a href="add.jsp">添加</a></td> </tr></table><br/></body>Show.jsp<body>用户名:<s:property value="ername"/><br>密 码:<s:property value="user.password"/><br>年 龄:<s:property value="user.age"/><br><a href="list.action">返回</a></body>Update.jsp<body><h1>用户更新</h1><s:form action="update"theme="simple"method="post"><s:textfield name="user.id"/>用户名:<s:textfield name="ername"/><br/>密 码:<s:password name="user.password" showPassword="true"/><br/>年 龄:<s:textfield name="user.age"/><br/><input type="submit"value="更新"><a href="list.action">查看用户列表</a></s:form></body>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
赵国正 2018年7月9日
目录
版本介绍
• 下载地址:/download.cgi#struts2516
• [WW-4546] - unclosed instantiation of PrintWriter • [WW-4741] - Http Sessions forcefully created for all requests using I18nInterceptor with default Storage value. • [WW-4873] - NotSerializableException - org.apache.struts2.dispatcher.StrutsRequestWrapper
升级须知
• 升级需要把struts2.5.16相关的jar文件下载并加入到项目 中 • 检查项目是否其他的框架需要升级 • 检查中间件版本
• 检查是否配置了拦截器
升级步骤
• 替换jar包
升级 JDK1.7.43
注意事项
• 升级过程中一定要考虑到其他依赖包小版本的问题 • 升级过程中一定要配置拦截器 • 升级过程中一定要考虑到其他依赖框架的版本问题
• [WW-4900] - NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector when using ExecuteAndWait interceptor
• [WW-4901] - ClassCastException in JarEntryRevision • [WW-4903] - Dependency Mapping Exception When Using PrefixBasedActionProxyFactory • [WW-4906] - The converter() method of com.opensymphony.xwork2.conversion.annotations.TypeConversion is now deprecated. If this method is removed in some next release, it will forbid to describe a converter by the name (id) of a Spring bean. • [WW-4908] - Conversion by annotation does not work • [WW-4909] - List of Boolean is not populated in Action class • [WW-4911] - JSONResult exception in struts2-json-plugin-2.5.14.1.jar • [WW-4918] - buttons with name="method:METHODNAME" sometimes ignore global-allowed-methods defined in struts.xml • [WW-4920] - Could not create JarEntryRevision for [zip:C:/.... unknown protocol c • [WW-4921] - NPE in I18nInterceptor$SessionLocaleHandler.read