• Struts2(三)


    以下内容是基于导入struts2-2.3.32.jar包来讲的

    1.全局视图配置

    xml标签:
    <global-results> <result name="error">/error.jsp</result> </global-results>
     1 package com.ronng.web.action;
     2 
     3 public class TwoAction {
     4     public String show(){
     5         return "error";
     6     }
     7     
     8     public String look(){
     9         return "error";
    10     }
    11 }
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <package name="com.rong.web.action" namespace="/" extends="struts-default">
            <!-- 全局视图。当action标签里面不包含result标签时,就会寻找全局的global-results结果视图 -->
            <global-results>
                <result name="error">/error.jsp</result>
            </global-results>
            <action name="error1" class="com.ronng.web.action.TwoAction" method="show">
            </action>
            <action name="error2" class="com.ronng.web.action.TwoAction" method="look">
            </action>
        </package>
        
    </struts>

    访问路径:

    http://localhost:8080/struts/error1

    http://localhost:8080/struts/error2

    返回的都是同一个error.jsp页面

    2.全局的异常配置

     1 package com.ronng.web.action;
     2 
     3 public class TwoAction {
     4     public String show() throws Exception{
     5         //抛出异常,无法返回"error"字符串
     6         int number=1/0;
     7         return "error";
     8     }
     9     
    10     public String look()throws Exception{
    11         return "error";
    12     }
    13 }

    struts.xml配置是有顺序的:全局结果视图需要放在全局异常的前面

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <package name="com.rong.web.action" namespace="/" extends="struts-default">
            
            <!-- 全局视图。当action标签里面不包含result标签时,就会寻找全局的global-results结果视图 -->
            <global-results>
                <result name="error">/error.jsp</result>
                <result name="exception">/exception.jsp</result>
            </global-results>
            <!-- 全局异常配置 。result对应全局视图的result的name-->
            <global-exception-mappings>
                <exception-mapping result="exception" exception="java.lang.Exception"></exception-mapping>
            </global-exception-mappings>
            <action name="error1" class="com.ronng.web.action.TwoAction" method="show">
            </action>
            <action name="error2" class="com.ronng.web.action.TwoAction" method="look">
            </action>
        </package>
        
    </struts>

    以上的方法不能处理类似404的错误,若要处理404错误,则只需要修改web.xml配置文件

    <error-page>标签配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>struts</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      
      <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>
      
      <error-page>
          <error-code>404</error-code>
          <location>/404.jsp</location>
      </error-page>
    </web-app>

    3.最简单的action配置

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <package name="com.rong.web.action" namespace="/" extends="struts-default">
            <!-- 最简单的action
                class 默认是struts-default.xml的  
                    <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
                默认执行的method 是 execute
                方法默认的返回值是什么 "success"
             -->
            <!-- 对于最简单的action也就是
            没有配置class的action要执行的哪个action,
            可以不使用默认的,重新配置 ,但是依然会使用默认的 execute方法-->
            <default-class-ref class="com.ronng.web.action.OneAction"></default-class-ref>
            <action name="simple">
                <result>/index.jsp</result>
            </action>
        </package>
        
    </struts>

    4.路径访问搜索顺序

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!-- 
            资源路径
            http://localhost:8080/struts/search
            http://localhost:8080/struts/aa/bb/cc/search
            以上两种方式均可访问到同一页面
            其中http://localhost:8080/struts是服务器以及项目信息
                主要看这段:/aa/bb/cc/search
                搜索顺序:没找到时继续往前找,由于search是action里面的name路径,所以最后才判断
                先判断package,最后才判断action
                    namespace是/aa/bb/cc
                    namespace是/aa/bb
                    namespace是/aa
                    namespace是/
                    有这个/的命名空间了
                        那就在这个命名空间的action里找search
         -->
        <!-- namespace命名空间不写时,默认是斜杠"/" -->
        <package name="com.rong.web.action" namespace="/" extends="struts-default">
            <action name="search" class="com.ronng.web.action.OneAction">
                <result>/index.jsp</result>
            </action>
        </package>
        
    </struts>

     5.获取域对象以及ActionContext上下文

    A.第一种方式(通过ServletActionContext获取)

     1 package com.ronng.web.action;
     2 
     3 import javax.servlet.ServletContext;
     4 import javax.servlet.http.HttpServletRequest;
     5 import javax.servlet.http.HttpSession;
     6 import javax.servlet.jsp.PageContext;
     7 
     8 import org.apache.struts2.ServletActionContext;
     9 
    10 /**
    11  * 普通类获取域对象
    12  * 通过ServletActionContext获取
    13  * @author Rong
    14  *
    15  */
    16 public class TwoAction {
    17     public String show() throws Exception{
    18         //使用原生API,耦合度高,很少使用
    19         PageContext pageContext = ServletActionContext.getPageContext();
    20         //可通过pageContext获取其余域对象
    21 //        ServletRequest request = pageContext.getRequest();
    22 //        HttpSession session = pageContext.getSession();
    23 //        ServletContext application = pageContext.getServletContext();
    24         HttpServletRequest request = ServletActionContext.getRequest();
    25         //获取前台传过来的值
    26         String parameter = request.getParameter("name");
    27         System.out.println(parameter);
    28         HttpSession session = request.getSession();
    29         ServletContext application = ServletActionContext.getServletContext();
    30         request.setAttribute("name", "rong");
    31         session.setAttribute("name", "jie");
    32         application.setAttribute("name", "long");
    33         return "success";
    34     }
    35 }
    <body>
        通用的域: ${name }<br/>
        request域:${requestScope.name }<br/>
        session域:${sessionScope.name }<br/>
        application域:${applicationScope.name }<br/>
    </body>
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <package name="com.rong.web.action" namespace="/" extends="struts-default">
            <action name="search" class="com.ronng.web.action.TwoAction" method="show">
                <result>/two.jsp</result>
            </action>
        </package>
    </struts>

    B.第二种方式(ActionContext上下文的get方式)

     1 package com.ronng.web.action;
     2 
     3 import org.apache.struts2.dispatcher.ApplicationMap;
     4 import org.apache.struts2.dispatcher.RequestMap;
     5 import org.apache.struts2.dispatcher.SessionMap;
     6 
     7 import com.opensymphony.xwork2.ActionContext;
     8 
     9 /**
    10  * 普通类获取域对象
    11  * 通过ActionContext上下文get方式获取
    12  * 松耦合
    13  * @author Rong
    14  */
    15 public class TwoAction {
    16     public String show() throws Exception{
    17         //获取ActionContext上下文。ActionContext在请求最开始的时候封装了所有数据。
    18         ActionContext actionContext = ActionContext.getContext();
    19         //通过get方法获取域对象。其中get里面的字符串是唯一指定的。
    20         RequestMap requestMap = (RequestMap) actionContext.get("request");
    21         SessionMap<String, Object> sessionMap = (SessionMap<String, Object>) actionContext.get("session");
    22         ApplicationMap applicationMap = (ApplicationMap) actionContext.get("application");
    23         requestMap.put("name", "rong");
    24         sessionMap.put("name", "jie");
    25         applicationMap.put("name", "long");
    26         return "success";
    27     }
    28 }

    C.第三种方式(ActionContext上下文的getXxx方式)

     1 package com.ronng.web.action;
     2 
     3 import java.util.Map;
     4 
     5 import com.opensymphony.xwork2.ActionContext;
     6 
     7 /**
     8  * 普通类获取域对象
     9  * 通过ActionContext上下文getXxx方式获取
    10  * 松耦合
    11  * @author Rong
    12  */
    13 public class TwoAction {
    14     public String show() throws Exception{
    15         //获取ActionContext上下文。ActionContext在请求最开始的时候封装了所有数据。
    16         ActionContext actionContext = ActionContext.getContext();
    17         Map<String, Object> request = actionContext.getContextMap();
    18         Map<String, Object> session = actionContext.getSession();
    19         Map<String, Object> application = actionContext.getApplication();
    20         request.put("name", "rong");
    21         session.put("name", "jie");
    22         application.put("name", "long");
    23         return "success";
    24     }
    25 }

    D.第四种方式(实现XxxAware接口)

    根据需要实现不同域的接口

     1 package com.ronng.web.action;
     2 
     3 import java.util.Map;
     4 
     5 import org.apache.struts2.interceptor.ApplicationAware;
     6 import org.apache.struts2.interceptor.RequestAware;
     7 import org.apache.struts2.interceptor.SessionAware;
     8 
     9 
    10 /**
    11  * 实现接口方式获取域对象
    12  * 松耦合
    13  * @author Rong
    14  * 这里列举了实现多种域接口,实际根据自己需要实现接口
    15  */
    16 public class TwoAction implements RequestAware,SessionAware,ApplicationAware{
    17     //需要自己去声明成员变量(域对象)
    18     private Map<String, Object> request;
    19     private Map<String, Object> session;
    20     private Map<String, Object> applicaton;
    21     public String show() throws Exception{
    22         request.put("name", "r");
    23         session.put("name", "j");
    24         applicaton.put("name", "l");
    25         return "success";
    26     }
    27     //域对象赋值
    28     @Override
    29     public void setApplication(Map<String, Object> arg0) {
    30         this.applicaton=arg0;
    31     }
    32 
    33     @Override
    34     public void setSession(Map<String, Object> arg0) {
    35         this.session=arg0;
    36     }
    37 
    38     @Override
    39     public void setRequest(Map<String, Object> arg0) {
    40         this.request=arg0;
    41     }
    42 }
  • 相关阅读:
    UVA 707
    我写了一起 Makefile(一)
    百度mp3接口
    MBProgressHUD -[__NSCFString sizeWithAttributes:]: unrecognized selector问题解决了
    BCM策略路由交换芯片
    HDU 4006 The kth great number AVL解
    PHP进口Excel至MySQL方法
    隐藏Console形式无效(继续1)
    优秀的前端project如何制定一个老师--html学习路径
    地址阵列
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/8167418.html
Copyright © 2020-2023  润新知