struts1.x的缺陷:
1.与servlet API严重耦合,不利于测试。
在action的实现类中,针对方法execute(mapping,form,request,response ),request,response属于servlet的API,严重依赖于Web容器,一旦脱离容器,难于测试。
2. 代码严重依赖于Strut1.x属于侵入式设计。
Action要继承Action类,在方法中有依赖于Servlet API,代码重用性不高,属于侵入式的设计。
---------------------------------------------------
Struts2.0简介:
1. 大量采用了拦截器来处理用户请求,从而语序用户的业务逻辑控制器于Servlet API 相分离。
2. struts2属于典型的AOP编程,使用拦截器作为advice,用户的业务处理作为target,创建一个控制器代理。
---------------------------------------------------
Struts2.0工作原理:
1.浏览器发送请求;
2.核心控制器FilterDispatcher根据请求觉得调用合适的Action;
3.WebWork的拦截器链自动对请求应用通用功能,如workflow,validation或文件等功能;
4.回调Action的execute方法,该方法先获取用户请求参数,然后执行某种数据库操作;实际上,因为Action只是一个
5.Action 的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面,图像,也可以是pdf文档或者其他文档。
---------------------------------------------------
Struts2.0工作原理:
第一步
下载包:http://struts.apache.org/download.cgi#struts2181
这里无须加载所有的包,如果不整合Spring,只要将以下加入工程:
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.5.jar
如果导入所有,则一启动服务就报错
整合Spring时,在导入struts2-spring-plugin-2.0.11.2.jar
第二步
在web。xml中配置Struts2.0的核心Filter
<filter>
<filter-namee>strtuts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>strtuts2</filter-name>
<url-pattern>/*</url-p>
</filter-mapping>
第三步
实现控制器类,就是一个Action 或者说是一个pojo
(com.action包)
public class UserAction{
private String userName;
private String userPass;
public String getUserName(){
return this.userName;
}
public void setUserName(String userName){
this.userName;
}
public String getUserPass(){
return this.userPass;
}
public void setUserName(String userPass){
this.userPass=userPass;
}
//--回调方法
public String execute(){
if(this.userName.equals("aaa")&& this.userPass.equals("aaa")){
return "ok";
}
return "no";
}
}
** 表面上看起来,该Action的两个属性只是提供了对应的setter和getter方法,很难理解请求参数在什么时候赋值给该Action的属性,因为Struts2的拦截器机制,他们负责解析用户的请求参数,并将请求参数值给Action对应的实现。
第四步
配置Action .
在src目录下新建struts.xml,让Action能够处理请求,并处理结果和资源的映射关系。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC "-//Apache SoftwareFoundaion//DTD Struts COnfiguration 2.0//EN" http://struts.apache.org.org/dtds/struts-2.0.dtd>
<struts>
<include file="struts-default.xml"></inlude>
<!-- 我在测试之时,删除该一句代码(<include>),并没有报错,一切运行正常,暂时没有发现他有什么用 -->
<package name="pck" extends="struts-default"> <!-- 注意此处的struts-default一定要写对 -->
<!---注意action一定要包括在package中!!-->
<action name="user" class="com.action.UserAction">
<result name="ok"'>main.jsp</result>
<result name="no"'>login.jsp</result>
</action>
</package>
</struts>
第五步
创建视图页面:login.jsp,mian.jsp;
在login.jsp中:
<form method="post" action="user.action" name="loginForm">
<input type="text" name="userName">
<input type="tpassword" name="userPass">
<input type="submit" value="登录">
</form>
*注意action的值为*。action
Struts2.0中跟踪用户状态:
Action 中所有的属性都被封装到了ValueStack对象中,Action中属性民可以理解为ValueStqack中value的名字。
在jsp页面中可是通过使用Struts标签获得对应的属性值,也可以使用EL表达式:如${userName};
如果将封装在Map中,有说法是封装到Session中,但这不是封装到Servlet中的session中,而是java通过 com.opensymphony.xwork2.ActionContex.getContext().getSession(),该方法返回Map集 合,加入userName放入其中:
代码为:
Map map = com.opensymphony.xwork2.ActionContex.getContext().getSession();
map.put("name",this.getUserName());
在jsp页面中的取值方式为${sessionScope.name};
ActionContex.getContext().getSession()方式是将值保存在session作用域中,如果在UserAction中存在了uname这个属性字段,
并且先于使用map.put()方式赋值,那么在jsp页面中使用${uname},返回得到的是UserAction类中原来是定的值,而不是通 过map重新赋的值,这是因为前者是将值保存在了ValueStack中,而使用如${uname},是直接从ValueStack中取值,因此返回的不 是通过map的put方法重新设置的值,要获得通过map的put方法设置的值必须使用如下方式:${sessionScope.name};