在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()
原文地址:https://www.cnblogs.com/wyhluckdog/p/10099532.html