zoukankan      html  css  js  c++  java
  • 21.struts-Action配置.md


    目录

    1.Action开发方式

    • 继承ActionSupport-struts的数据过滤等方法封装在其中,开发中用此方法
    • 实现Action
    • 既不实现也不实现

    Action类中定义了一些常量,例如常用返回的标签success,有对应的常量SUCCESS

    2.通配符

    当有两个Action中的方法,返回了同一个标签,那么在struts.xml配置中,不需要多次配置,可以用通配符。

    package per.liyue.code.struts2demo;
    import com.opensymphony.xwork2.ActionSupport;
    public class HelloStruts2 extends ActionSupport{
        //定义了一个常量或者对象和前台交互时候使用 
        private String userName;    
        //必须提供get和set方法,否则struts不会自动填充
        public String getUseName() {
            return userName;
        }
        public void setUseName(String useName) {
            this.userName = useName;
        }
        @Override
        public String execute() throws Exception {
            System.out.println("进入了Action开始处理代码! 用户:" + userName);
            return "success";
        }
        
        public String login(){
            System.out.println("进入了Action的login中处理! 用户:" + userName);
            return SUCCESS;
        }
        
        public String register(){
            System.out.println("进入了Action的register中处理! 用户:" + userName);
            return SUCCESS;
        }
    }
    

    此时,用*来表示通配地址
    ·```xml

        <!-- 使用通配符实现 -->        
        <action name="user_*" class="per.liyue.code.struts2demo.HelloStruts2" method="{1}">
            <result name="success">/success.jsp</result>
        </action>
        
    </package>
    
    此时在浏览器中的访问地址由:
    >http://localhost.:8080/StrutsDemo1/register
    
    
    变为:
    >http://localhost.:8080/StrutsDemo1/user_register
    或者
    http://localhost.:8080/StrutsDemo1/user_login
    
    
    
    此外还可以再进一步,将*和{1}搭配使用,下面的修改将action中的返回标签和配置文件中的对应标签全部用通配符处理:
    ```java
    package per.liyue.code.struts2demo;
    import com.opensymphony.xwork2.ActionSupport;
    public class HelloStruts2 extends ActionSupport{
        //定义了一个常量或者对象和前台交互时候使用 
        private String userName;    
        //必须提供get和set方法,否则struts不会自动填充
        public String getUseName() {
            return userName;
        }
        public void setUseName(String useName) {
            this.userName = useName;
        }
        
        public String login(){
            System.out.println("进入了Action的login中处理! 用户:" + userName);
            return "login";
        }
        
        public String register(){
            System.out.println("进入了Action的register中处理! 用户:" + userName);
            return "register";
        }
    }
    
    <?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="config_HelloStruts2" extends="struts-default" >
            <!-- 同一个标签用类似的重复代码实现 
            <action name="login" class="per.liyue.code.struts2demo.HelloStruts2" method="login">
                <result name="success">/success.jsp</result>
            </action>
            <action name="register" class="per.liyue.code.struts2demo.HelloStruts2" method="register">
                <result name="success">/success.jsp</result>
            </action>
            -->
            
            <!-- 使用通配符实现 -->        
            <action name="user_*" class="per.liyue.code.struts2demo.HelloStruts2" method="{1}">
                <result name="{1}">/success.jsp</result>
            </action>
            
        </package>
        
    </struts>
    ``
    
    
    此时浏览器地址为:
    >http://localhost.:8080/StrutsDemo1/user_login 
    
    
    
    
    # 访问地址
    如果定义了命名空间地址:
    ```xml
    <package name="config_HelloStruts2" namespace="/new" extends="struts-default" >  
    
    

    那么访问地址为:

    http://localhost.:8080/StrutsDemo1/new/user_login

    访问地址的情况:

    路径格式 是否可访问 备注
    http://localhost.:8080/StrutsDemo1/new/user_login 可以 标准访问
    http://localhost.:8080/StrutsDemo1/new/a/user_login 可以 struts会一层层解析,在/new这层可以得到结果并返回
    http://localhost.:8080/StrutsDemo1/a/new/user_login 不可以 无法解析出可用的action地址

    目录

    3.常量

    后缀

    • 在struts中的默认后缀是.do
    • 在struts2中默认的后缀是.action
      如果需要修改,在

    /org/apache/struts2/default.properties

    文件中,先找到

    struts.action.extension=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>
        <!-- 全局配置后缀 -->
        <!-- struts2中拷贝的源代码:struts.action.extension=action,,
             然后key和value的匹配则可以修改
         -->
         <!--这个修改还是沿用默认的修改 
        <constant name="struts.action.extension" value="action,,"></constant>
        -->
        <!-- 这个修改支持action和do后缀,并且不允许空 
        <constant name="struts.action.extension" value="action,do,"></constant>
        -->
        <!-- 这个修改支持action和do后缀,并且允许空 
        <constant name="struts.action.extension" value="action,do,,"></constant>
        -->
        
        
        <!-- 在总配置文件中引入其他配置文件 -->
        <include file="per/liyue/code/struts2demo/config_HelloStruts2.xml"></include>    
    </struts>
    

    指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出

    <constant name="struts.i18n.encoding" value="UTF-8"/>
    

    自定义后缀修改常量

    <constant name="struts.action.extension" value="do"/>
    

    设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

    <constant name="struts.serve.static.browserCache" value="false"/>
    

    当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开

    <constant name="struts.configuration.xml.reload" value="true"/>
    

    开发模式下使用,这样可以打印出更详细的错误信息

    <constant name="struts.devMode" value="true" />
    

    默认的视图主题

    <constant name="struts.ui.theme" value="simple" />
    

    与spring集成时,指定由spring负责action对象的创建

    <constant name="struts.objectFactory" value="spring" />
    

    该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性

    为 false

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    

    上传文件的大小限制

    <constant name="struts.multipart.maxSize" value=“10701096"/>
    

    4.数据处理

    获取Servlet的api

    继承ActionSupport类

    实现接口RequestAware、SessionAware、ApplicationAware

    1. 先实现Action类:
    
    
    package per.liyue.code.struts2_data;
    import java.util.Map;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import org.apache.struts2.ServletActionContext;
    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.interceptor.SessionAware;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    public class DataAction extends ActionSupport{
        
        @Override
        public String execute() throws Exception {
            /*
             * struts2中对数据的操作方式1:
             * 获取到servlet api
             */
            //获取
            HttpServletRequest request = ServletActionContext.getRequest();
            HttpSession session = request.getSession();
            ServletContext servletContext = ServletActionContext.getServletContext();
            //传入
            request.setAttribute("api_request_data", "request_api");
            session.setAttribute("api_session_data", "session_api");
            servletContext.setAttribute("api_servletContext_data", "servletContext_api");
            
            /*
             * struts2中对数据的操作方式2:
             * struts2将相应的对象封装到了Map
             */
            //获取对象
            ActionContext context = ActionContext.getContext();
            //获取request的map
            Map<String, Object> contextMap = context.getContextMap();
            //获取session的map
            Map<String, Object> session_Map = context.getSession();
            //获取ServletContext的map
            Map<String, Object> application = context.getApplication();
            
            //传入
            contextMap.put("map_request_data", "request_map");
            session_Map.put("map_session_data", "session_map");
            application.put("map_servletContext_data", "servletContext_map");
            
            return SUCCESS;
        }
    }
    
    
    1. 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="data" namespace="/" extends="struts-default">
            <!-- 全局配置 -->
            <global-results>
                <result name="success">/data.jsp</result>
            </global-results>
            
            <action name="data" class="per.liyue.code.struts2_data.DataAction"></action>
            
            <action name="data_implements" class="per.liyue.code.struts2_data.DataAction_implement">
                <result name="success">/data_implements.jsp</result>
            </action>
        </package>
        
    </struts>
    
    
    1. 前端的jsp页面
    
    
    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
      </head>
      
      <body>
       
       ${api_request_data} <br/>
       ${api_session_data} <br/>
       ${api_servletContext_data} <br/>
       
       ${map_request_data} <br/>
       ${map_session_data} <br/>
       ${map_servletContext_data} <br/>
       
      </body>
    </html>
    
    
    1. 总配置文件
    
    
    <?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>
        <!-- 全局配置后缀 -->
        <!-- struts2中拷贝的源代码:struts.action.extension=action,,
             然后key和value的匹配则可以修改
         -->
         <!--这个修改还是沿用默认的修改 
        <constant name="struts.action.extension" value="action,,"></constant>
        -->
        <!-- 这个修改支持action和do后缀,并且不允许空 
        <constant name="struts.action.extension" value="action,do,"></constant>
        -->
        <!-- 这个修改支持action和do后缀,并且允许空 
        <constant name="struts.action.extension" value="action,do,,"></constant>
        -->
        
        
        <!-- 在总配置文件中引入其他配置文件 -->
        <include file="per/liyue/code/struts2demo/config_HelloStruts2.xml"></include>  
        
        <include file="per/liyue/code/struts2_data/data.xml"></include>   
    </struts>
    
    

    对于接口实现的方式:

    1. Action类
    
    
    package per.liyue.code.struts2_data;
    import java.util.Map;
    import org.apache.struts2.interceptor.ApplicationAware;
    import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.interceptor.SessionAware;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    public class DataAction_implement extends ActionSupport 
                                      implements RequestAware, SessionAware, ApplicationAware {
        private Map<String, Object> request_implements;
        private Map<String, Object> session_implements;
        private Map<String, Object> servletContext_implements;
        /*
         * 接口方式实现
         */
        // struts运行时候,会把代表request的map对象注入
        @Override
        public void setRequest(Map<String, Object> request) {
            this.request_implements = request;
        }
        
        //session注入
        @Override
        public void setSession(Map<String, Object> session) {
            this.servletContext_implements = session;
        }
        
        //application注入
        @Override
        public void setApplication(Map<String, Object> application) {
            this.servletContext_implements = application;
        }
        
        @Override
        public String execute() throws Exception {
            /*
             * struts2中对数据的操作方式3: 实现接口RequestAware, SessionAware, ApplicationAware
             */
            request_implements.put("implements_request_data", "request_implements");
            session_implements.put("implements_session_data", "session_implements");
            servletContext_implements.put("implements_request_data", "request_implements");
            return SUCCESS;
        }
    }
    
    
    1. 配置Action文件

    xml文件同上

    1. jsp文件
    
    
    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
      </head>
      
      <body>
       
       
       ${implements_request_data} <br/>
       ${implements_session_data} <br/>
       ${implements_request_data} <br/>
       
      </body>
    </html>
    
    
    1. 总配置文件

    xml同上

  • 相关阅读:
    闭包的最准确的解释-待翻译
    undefined 和 null 的异同
    Javascript深度克隆一个对象
    产品培训的经验
    JavaScript库开发者们的规则
    IOS ——UI篇—— UITableView的常用属性及代理方法的用法总结
    IOS ——UI篇—— 自定义UITableViewCell的方法
    IOS ——UI篇—— UIScrollView的用法总结
    使用UIKit中的tag属性要注意的
    IOS ——UI篇——UITabBarController的基本用法
  • 原文地址:https://www.cnblogs.com/bugstar/p/8512802.html
Copyright © 2011-2022 走看看