博客信息

Struts2综述

0
发布时间:『 2016-09-24 18:22』  博客类别:java框架  阅读(472) 评论()

SSH : Spring + Struts2 + Hibernate

三层架构(表示层,业务逻辑层,数据访问层) MVC模式 (Model View Controller)

分层原则:单向依赖,接口耦合


1、Struts2  =  Struts  + Webwork



2、搭建struts2开发环境

   a>、到www.apache.org下载开发包

   b>、以 apps/struts-blank.war为蓝本

   c>、复制WEB-INF/lib下的jar包至工程构建路径

   d>、在web.xml中添加struts2的前端控制器

       <filter>

        <filter-name>struts2</filter-name>

        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

      </filter>


    <filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>


   e>、在src目录中创建一个名称为struts.xml的配置文件



3、让配置文件产生提示


4、让一个DIV页面居中

    #continer {

       text-align : left;

       width : 1000px;

       height : 400px;

       border : 1px solid red;

       /*居中显示*/

       position : absolute;

       left : 50%;

       margin-left : -500px;

     }


   -------- 或  -------------------

   #continer {

       text-align : left;

       width : 1000px;

       height : 400px;

       margin : 0px auto; /*firefox居中*/

    }


    body {

       padding : 0px;

       margin : 0px;

       text-align : center;  /*IE居中*/

    }



5、控制器的职责

    /**

* 控制器的处理流程

* 1、获取请求参数

* 2、验证请求参数

* 3、处理用户请求(访问业务组件)

* 4、处理异常

* 5、为视图准备数据(将数据放入模型[model])

* 6、选择视图生成响应

*/




 6、Action不是Servlet


 7、Struts2的Action每次请求创建一个


 8、输入校验

     a>、Action继承ActionSupport,覆盖validate()方法

b>、在参数格式不满足条件是调用addFieldError();

c>、只有调用过addFieldError()方法,代表验证失败,如果验证失败不会再执行execute()方法

d>、校验失败时action的执行结果为input,需要在struts.xml中添加name为input的result

e>、在jsp页面中要显示验证失败的错误消息,需要使用struts2的标签<s:fielderror/>


 9、struts2框架自身可能产生5种result

    success

none

error

input

login



==================================================================================================


10、捕获请求参数

    a>、将请求参数设置为Action的属性

   <tr>

  <td width="70" align="right">用户名:</td>

  <td>

      <input type="text" name="username" />

  </td>

</tr>

<tr>

  <td align="right">密码:</td>

  <td>

      <input type="password" name="password" />

  </td>

</tr>


public class Reg1Action extends ActionSupport {

           private String username;

           private String password;

    }

   b>、直接将请求参数封装为对象

                <tr>

  <td width="70" align="right">用户名:</td>

  <td>

      <input type="text" name="user.username" />

  </td>

</tr>

<tr>

  <td align="right">密码:</td>

  <td>

      <input type="password" name="user.password" />

  </td>

</tr>


public class Reg1Action extends ActionSupport {

           private User user;

    }

   c>、使用模型驱动(ModelDriven)

                <tr>

  <td width="70" align="right">用户名:</td>

  <td>

      <input type="text" name="username" />

  </td>

</tr>

<tr>

  <td align="right">密码:</td>

  <td>

      <input type="password" name="password" />

  </td>

</tr>


          public class Reg1Action extends ActionSupport implements ModelDriven<User> {

           private User user;

public User getModel() {

                    if(user == null) {

                        user = new User();

}

return user;

}

     }


 默认情况下,请求参数是绑定至Action对象的属性,如果Action实现了ModelDriven接口,请求参数将不再绑定至Action,而是

 getModel()方法返回的对象上

11、Action如何向JSP传递数据

    a>、使用Action的属性

private String msg;

public String getMsg() {

return msg;

}


@Override

public String execute() throws Exception {

msg = "用户注册成功!";

return "message";

}


    b>、使用ActionContext

public String execute() throws Exception {

new UserServiceBean().save(user); // 执行保存

ActionContext.getContext().put("msg", "@@用户注册成功");

return "message";

}



12、访问Servlet api


    HttpServletRequest    :

    getParameter()        : 获取请求参数

getParameterValues()

getHeader("")

getContextPath()

getCookies()

setAttrbute(key,value)  : 共享数据

getRequestDispatcher().forward()  : 转发

HttpServletResponse

   addHeader() : 添加响应头

addCookie() : 添加Cookie

sendRedirect() : 重定向

HttpSession

        get/setAttribute()

invalidate() : 销毁session

ServletContext

  get/setAttribute()

  getRealPath()


a>、如果只是为了共享数据,可以使用Map

     aa>、直接获取

          Map<String, Object> session =  context.getSession(); //获取用于存储数据的map对象

 Map<String, Object> application = context.getApplication();

 String company = (String) session.get("company");

 session.put("data", "a session scope data");

 application.put("data", "a application scope data");

bb>、依赖注入


         public class ServletApi2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {

  private Map<String,Object> request;

  private Map<String,Object> session;

  private Map<String,Object> application;


@Override

public void setRequest(Map<String, Object> request) {

System.out.println("call setRequest()");

this.request = request;

}


@Override

public void setApplication(Map<String, Object> application) {

this.application = application;


}


@Override

public void setSession(Map<String, Object> session) {


this.session = session;

}

}


b>、如果要执行其它操作,则必须使用原生对象

     aa>、直接获取

          HttpServletRequest request = ServletActionContext.getRequest();

 HttpServletResponse response = ServletActionContext.getResponse();

 HttpSession session = request.getSession();

ServletContext application = ServletActionContext.getServletContext();

bb>、依赖注入

     public class ServletApi4Action extends ActionSupport implements

     ServletRequestAware, ServletResponseAware, ServletContextAware {

private HttpServletRequest request;

private HttpServletResponse response;

private HttpSession session;

private ServletContext application;


@Override

public void setServletContext(ServletContext application) {

this.application = application;

}


@Override

public void setServletResponse(HttpServletResponse arg0) {

this.response = arg0;


}


@Override

public void setServletRequest(HttpServletRequest arg0) {

this.request = arg0;

this.session = request.getSession();

}

         }



13、一个Action处理多个请求

    a>、一个Action类有多个与execute()相似签名的方法,每个方法处理一个请求

         public class UserAction extends ActionSupport {

public String save() throws Exception {

return "message";

}


public String update() throws Exception {

return "message";

}


public String delete() throws Exception {

return "message";

}

         }


 b>、从struts2.3开始不可使用

    <a href="userMgr!save.action">添加用户</a>

    <a href="userMgr!update.action">修改用户</a>

    <a href="userMgr!delete.action">删除用户</a>


      c>、动态方法调用

        <!-- {1}代表第一个*号的值 -->

       <action name="user_*" class="com.sxt.struts2.web.action.UserAction" method="{1}">

           <result name="message">/WEB-INF/jsp/message.jsp</result>

       </action>


  <a href="user_save.action">添加用户</a>

  <a href="user_update.action">修改用户</a>

  <a href="user_delete.action">删除用户</a>

     d>、更复杂的示例

User_add.action,Employee_delete.action,Dept_query.action

<action name="*_*" class="xxx.action.{1}Action" method="{2}">

 <result name="input">/WEB-INF/jsp/{1}/{2}.jsp</result>

</action>



14、struts.xml中的配置项

    <struts>

       <bean class=""/> <!--注册bean组件-->

       <!-- 注册未知处理器 -->

  <unknown-handler-stack>

          <unknown-handler-ref name=""></unknown-handler-ref>

       </unknown-handler-stack>

       <include file="user.xml"/> <!-- 包含另一个配置文件-->

       <!-- 修改struts2工作中的一些设定 ,可修改的设定来自于struts2-core-2.x.xx.jar中org.apache.struts2包中default.properties-->

       <constant name="struts.i18n.encoding" value="utf-8"></constant> <!-- post请求参数的字符集 -->

  <!-- 抽象包中不能定义action -->

<!-- 一个action请求路径由 package的namespace + action的name属性组成 -->

<package name="default" extends="struts-default" abstract="false" namespace="/system/base">

             <!-- 注册result解析器类 -->

<result-types>

<result-type name="sxt" class="com.sxt.struts2.result.TestResult"></result-type>

</result-types>


<!-- 注册拦截器 -->

<interceptors>

<interceptor name="test" class="com.sxt.struts2.web.interceptor.TestInterceptor"></interceptor>

<!-- 用于将多个拦截器组合成一个 -->

<interceptor-stack name="testStack">

<interceptor-ref name="test"/>

<interceptor-ref name="defaultStack"/>

</interceptor-stack>

</interceptors>


  <!-- 指定默认的拦截器 -->

 <default-interceptor-ref name="testStack"/>


<!-- 指定默认的Action类 <action name="" > -->

<!-- <default-class-ref class=""></default-class-ref> -->


<!-- 指定默认的action -->

<default-action-ref name="default"/>

<!-- 全局result设定,可以被该包中的所有action使用 -->

<global-results>

<result name="message">/WEB-INF/jsp/message.jsp</result>

</global-results>


<!-- 全局的异常处理声明 -->

<global-exception-mappings>

<exception-mapping result="error" exception="java.lang.Exception"/>

</global-exception-mappings>



<action name="test">

<result>/WEB-INF/jsp/message.jsp</result>

</action>


<action name="result" class="com.sxt.struts2.web.action.ResultAction">

<!-- 当action的执行结果为a时,由sxt所对应的解析器类生成响应 -->

<result name="a" type="sxt">

<param name="location">/WEB-INF/jsp/message.jsp</param>

</result>


 <!-- 声明Action需要使用哪些拦截器,一旦使用该元素,则默认拦截器不再有效 -->

<!--

<interceptor-ref name="test"></interceptor-ref>

<interceptor-ref name="defaultStack"></interceptor-ref>

-->


            </action>

</package>

</struts>


=======================================================================================================


15、result的设定 (决定如何生成响应)

<!-- 转发至一个jsp -->

<result name="a" type="dispatcher">

<param name="location">/WEB-INF/jsp/message.jsp</param>

</result>


<!-- 重定向至一个jsp -->

<result name="b" type="redirect">

<param name="location">/WEB-INF/jsp/message.jsp</param>

</result>

<!-- 转发至一个Action -->

<result name="c" type="chain">

<param name="namespace">/aaa</param>

<param name="actionName">other</param>

</result>


<!-- 重定向至一个Action -->

<result name="d" type="redirectAction">

<param name="namespace">/aaa</param>

<!--动态传参 -->

<param name="actionName">other?username=${name}</param>

</result>


<!-- 文本响应 -->

<result name="e" type="plainText">

<!-- Content-Type : text/plain;charset=utf-8 -->

<param name="location">/WEB-INF/jsp/message.jsp</param>

<param name="charSet">utf-8</param>

</result>


   a>、转发操作,向下一个组件传值,直接将值存入ActionContext

        ActionContext.getContext().put(key,value);

   b>、重定位操作向下一个组件传值需要使用请求参数



16、拦截器(Interceptor)

     a>、编写一个类,实现Interceptor接口或继承AbstractInerceptor,完成String interceptor(ActionInvocation ai)方法

        public class TestInterceptor extends AbstractInterceptor /*implements Interceptor*/  {

/**

* 返回值为result

*/

@Override

public String intercept(ActionInvocation ai) throws Exception {

System.out.println("before...............");

String result = ai.invoke();  //放行

System.out.println("after.............\n");

return result;

}


}

    b>、在struts.xml注册拦截器

   <interceptors>

             <interceptor name="test" class="com.sxt.struts2.web.interceptor.TestInterceptor"/>

        </interceptors>



    c>、在action元素中声明该action所需要的拦截器

       <action name="aaa" class="xxx.XxxAction">

             <!-- 声明Action需要使用哪些拦截器,一旦使用该元素,则默认拦截器不再有效 -->

             <interceptor-ref name="test"></interceptor-ref>

             <interceptor-ref name="defaultStack"></interceptor-ref>

  </action>


17、国际化


    a>、实现步骤

   aa>、将页面中要显示的文字用特定的key编号后写到国际化资源文件中(可以有很多份,每份对应一个Locale,key相同,对应的文字不相同)

     Message.properties,Message_zh_CN.properties,Message_en_US.properties


        bb>、在struts.xml中注册国际化资源

             <constant name="struts.custom.i18n.resources" value="Message"/>

        cc>、在jsp页面中,使用s:text标签输出国际化消息

     <s:text name="login.title"/>


    b>、用户切换语言

   defaultStack中有一个名字为i18n的拦截器,它会检查请求参数中是否有一个名字为request_locale的请求参数,

如果有,则将该参数的值为转换为对应的Locale对象,并存入session,作为国际化的依据

        <a href="i18n_login.action?request_locale=zh_CN">中文</a>

<a href="i18n_login.action?request_locale=en_US">English</a>


   c>、在Action中要获取国际化消息使用getText(key)方法


   d>、struts2的国际化资源文件分为四种类型

       aa>、全局,在struts.xml注册的

  bb>、包范围,在action所在包中名字package的国际化资源文件: package.properties,package_zh_CN.properties

  cc>、Action范围,在action所在包中名字为Action名字的国际化资源文件: LoginAction.properties

  dd>、临时的,在使用时使用<s:i18n/>标签绑定的国际化资源文件

       <s:i18n name="com.sxt.struts2.resource.Hello">

                  <li> <s:text name="i18n.key2"></s:text> </li>

             </s:i18n>


       ee>、优先级为 : Action范围 > 包范围  > 全局范围


关键字:   Struts2     框架  

上一篇:Spring综述

下一篇:hibernate综述

Copyright © 2012-2017 yinbin.lan 版权所有   京ICP备16047123号