原理概述:
1、浏览器发起请求,经过一系列过滤器,到达核心过滤器StrutsPrepareAndExecuteFilter
2、通过actionMapper将请求交给Action代理,查询配置文件中需要调用的action,在调用前后会执行相关拦截器(登陆判断,用户权限)
3、创建一个actionInvocation实例,执行业务逻辑,返回结果集呈现给用户
缺点:
1、struts1的核心是个servlet ,与servlet API严重耦合,难于测试,而且还是单例,就造成了一定的限制。资源必须为线程安全或者同步
而struts2的核心是个过滤器,为每一个请求实例化一个对象,所以没有线程安全的问题。
2、struts1的Action类依赖于servlet API 属于侵入式设计 。struts2的Action与容器无关
3、struts1整合Jstl标签,所以就使用JSTL表达语言。struts2使用JSTL,也支持更灵活的OGNL
4、struts1用ActionForm对象来获取输入,并且还有验证功能。
struts2 Action属性作为输入属性,就减少了第二个输入对象的需要
详解:
1、在浏览器中输入http://localhost:8080/Self/LoginAction?account=123,就会向服务器端(tomcat)发送一个请求
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>com.selfpackage.action</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2、tomcat会解析URL,在web.xml文件找到filter标签,过滤url-pattern中的地址
@Namespace("/") @Action(value = "LoginAction", results = { // 成功跳转到主页面main.jsp @Result(name = "success", location = "main/main.jsp"), //@Result(name = "success", type="chain", location="preselectgroupAction"), // 失败跳转到登陆页面login.jsp @Result(name = "input", type = "chain", location = "nav_login")}) public String login() throws Exception {
……
return success;
}
3、在struts.xml中的package标签中的namespace中得到它的值,这里通过注解实现
4、根据返回的String字符串(success),在result中找到name属性值为返回的String字符串的标签
5、最后jsp反馈到客户端