• 在Struts2框架中使用Servlet的API


    1. 在Action类中也可以获取到Servlet一些常用的API
        * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上。
            * 提供JSP注册的页面,演示下面这三种方式
                <h3>注册页面</h3>
                <form action="${ pageContext.request.contextPath }/xxx.action" method="post">
                    姓名:<input type="text" name="username" /><br/>
                    密码:<input type="password" name="password" /><br/>
                    <input type="submit" value="注册" />
                </form>
    
    2. 完全解耦合的方式(完全不需要Servlet的api)(使用的核心类为:ActionContext类)
       * 如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API 
        * 一些常用的方法如下 * static ActionContext getContext() -- 获取ActionContext对象实例
        (ActionContext是上下文,也就是明星和经纪人的关系,action相当于明星,什么都不用准备,而actionContext就相当于经纪人(上下文),经纪人去拿action需要的东西。) * java.util.Map<java.lang.String,java.lang.Object> getParameters() -- 获取请求参数,相当于request.getParameterMap(); * java.util.Map<java.lang.String,java.lang.Object> getSession() -- 获取的代表session域的Map集合,就相当于操作session域。 * java.util.Map<java.lang.String,java.lang.Object> getApplication() -- 获取代表application域的Map集合 * void put(java.lang.String key, java.lang.Object value) -- 注意:向request域中存入值。(直接使用put是向request域中存放数据)     
        例:
        1.创建一个Action(demo1Action),内容如下:
    import java.util.Arrays;
    import java.util.Map;
    import java.util.Set;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    
    /*
     * 完全解耦合方式,使用servlet的api
     */
    public class demo1Action extends ActionSupport{
        @Override
        public String execute() throws Exception {
            //完全解耦合方式
            ActionContext context=ActionContext.getContext();
            //封装所有参数到一个map集合中
            Map<String, Object> map=context.getParameters();
            //再写一个表单来获取参数表单为index.jsp
            
            //遍历获取数据
            Set<String> keys=map.keySet();
            for(String key:keys){
                //因为从一个标签中获得的值不止一个,如爱好可能有多个,所以这里我们使用数组
                String[] values=(String[]) map.get(key);
                //姓名和密码只有一个,所以这里我们又强转为了字符串
                System.out.println(key+"..."+Arrays.toString(values));
            }
            //如果向request对象中存入值
            context.put("msg", "jack");//向request域中存放数据     request只有在请求转发时才有效
            context.getSession().put("msg", "rose");//向session中存放数据。通过getSession获得Session域对象
            context.getApplication().put("msg", "tom");//向应用域中存放数据。通过getAppication获得整个应用
            
            
            return SUCCESS;
        }
    }

          2.再写一个表单来获取参数表单为index.jsp,将获取到的数据存储到map集合中:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h3>完全解耦合的方式使用servlet的api</h3>
        <form action="${ pageContext.request.contextPath }/demo1Action.action" method="post"> 
            姓名<input type="text" name="username"/><br/>
            密码<input type="text" name="password"/><br/>
            <input type="submit" value="登录">
            
        </form>
    </body>
    </html>

          3.最后demo1Action返回值为SUCCESS,跳转到suc界面,所以书写suc.jsp文件,suc.jsp文件中的内容如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
        
        使用el表达式获取值<br/>
        ${requestScope.msg}<br/>
        ${sessionScope.msg}<br/>
        ${applicationScope.msg}<br/>
        
    </body>
    </html>
        4.为了访问Action,需要对其进行配置,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="default" namespace="/" extends="struts-default">
    
            <action name="demo1Action" class="com.huida.action.demo1Action">
                <result name="success">/suc.jsp</result><!-- 从demo1Action中跳转到suc.jsp页面,默认的方式为请求转发的方式。如果在result标签中设定转发类型为重定向redirect,那么在request域中就不能通过put获取到值 -->
            </action>
        </package>
    
    
    </struts>
        运行index.jsp后,在浏览器中的表单中输入姓名以及密码,然后点击提交。

        在控制台输出如下内容,说明通过ActionContext的getparameters已经获取到表单中的数据:
        

        同时浏览器跳转到suc.jsp页面中,浏览器显示内容如下,说明request域、session域、应用域已经获得了在action中放的数据:

         

         通过配置文件我们可以看到,直接从action跳转到suc.jsp页面中,然后获得request域中的内容。而request只存在于请求转发过程中,所以从demo1Action中                   跳转到suc.jsp页面,默认的方式为请求转发方式。如果在result标签中设定转发类型为重定向redirect,那么在request域中就不能通过put获取到值。

    3. 使用原生Servlet的API的方式(通过ServletActionContext得到request)(核心类为ServletActionContext类)
        * Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法
        * 具体的方法如下
            * getPageContext()
            * getRequest()
            * getResponse()
            * getServletContext()
  • 相关阅读:
    Java 单测 回滚
    Java四种线程池的使用
    git gc
    Git 常用命令
    JPA 批量新增
    SpringData JPA 排除 扫描 exclude-filter 不能使用解决
    开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    深入浅出 RPC
    阿里 Java面试 知识点
    Eclipse Egit 安装
  • 原文地址:https://www.cnblogs.com/wyhluckdog/p/10099532.html
Copyright © 2020-2023  润新知