Struts2.0小记

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};

你可能感兴趣的:(Struts2.0;概要;)