(4)获取servlet常用api

*五)与ServletAPI解耦

方式1

AddAction

public String execute() throws Exception, IOException{
        //获取请求对象request 响应对象response 应用对象ServletContext
        HttpServletRequest request=ServletActionContext.getRequest();
        HttpServletResponse response=ServletActionContext.getResponse();
        ServletContext context=ServletActionContext.getServletContext();
        //获取表单参数
        Integer num1=Integer.parseInt(request.getParameter("num1"));
        Integer num2=Integer.parseInt(request.getParameter("num2"));
        Integer sum=num1+num2;
        //将请求结果放在应用对象中
        context.setAttribute("sum", sum);
        //将结果放在域对象request中
        //request.setAttribute("sum", sum);
        //转发到add.jsp中  由struts.xml中的result代替
        //request.getRequestDispatcher("/add.jsp").forward(request, response);
        return "success";
    }

struts_add.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="add" extends="struts-default" namespace="/">
        <action name="add" class="cn.itcast.web.struts2.add.AddAction">
            <result name="success" type="redirect">
                /add.jsp
            </result>
        </action>
    </package>    
</struts>    

add.jsp

${applicationScope.sum}

方式2

AddAction

public String execute() throws Exception, IOException{
        //获取请求对象request 响应对象response 应用对象ServletContext
        HttpServletRequest request=ServletActionContext.getRequest();
        HttpServletResponse response=ServletActionContext.getResponse();
        //方式2
        Map<String,Object> applicationMap=ActionContext.getContext().getApplication();
        
        //获取表单参数
        Integer num1=Integer.parseInt(request.getParameter("num1"));
        Integer num2=Integer.parseInt(request.getParameter("num2"));
        Integer sum=num1+num2;
        
        applicationMap.put("sum", sum);
        //将结果放在域对象request中
        //request.setAttribute("sum", sum);
        //转发到add.jsp中  由struts.xml中的result代替
        //request.getRequestDispatcher("/add.jsp").forward(request, response);
        return "success";
    }

add.jsp仍然是${applicationScope.sum}

原则:Action不要与传统ServletAPI耦合  目的:解耦

方式3AddAction

public String execute() throws Exception, IOException{
        //获取请求对象request 响应对象response 应用对象ServletContext
        //HttpServletRequest request=ServletActionContext.getRequest();
        HttpServletResponse response=ServletActionContext.getResponse();
        //方式3
        HttpSession session=request.getSession();//用了Servlet的API,不推荐
        Map<String,Object> sessionMap=ActionContext.getContext().getSession();
        //获取表单参数
        Integer num1=Integer.parseInt(request.getParameter("num1"));
        Integer num2=Integer.parseInt(request.getParameter("num2"));
        Integer sum=num1+num2;
        sessionMap.put("sum", sum);
        //将结果放在域对象request中
        //request.setAttribute("sum", sum);
        //转发到add.jsp中  由struts.xml中的result代替
        //request.getRequestDispatcher("/add.jsp").forward(request, response);
        return "success";
    }

add.jsp  ${sessionScope.sum}

(1)获取HttpServletRequest请求对象/域对象【ServletActionContext.getRequest()】

    的父类【ActionContext.getContext().put("username",username);】

  ActionContext.getContext()返回Map<String,Object>
  获取HttpServletResponse请求对象/域对象【ServletActionContext.getResponse()】
(2)获取ServletContext域对象【ActionContext.getContext().getApplication()】
(3)获取HttpSession域对象【ActionContext.getContext().getSession()】
(4)为什么(2)(3)会返回Map类型呢?
  这是因为Struts2的Action中,不推荐引用ServletAPI,因为只返回Map对象。
  拦截器会将Map中的值,再一次绑定到真实的域对象中,其中key就是Map中的key值。

(5)

day31WebRoot egister.jsp

 <form action="/day31/register" method="post">
          <table border="2" align="center">
              <caption><h3>新用户注册(struts2版本)</h3></caption>
              <tr>
                  <th>用户名</th>
                  <td><input type="text" name="username"/></td>
              </tr>
              <tr>
                  <th>密码</th>
                  <td><input type="text" name="password"/></td>
              </tr>
              <tr>
                  <td colspan="2" align="center">
                      <input type="submit" value="注册"/>
                  </td>
              </tr>
          </table>
      </form>
cn.itcast.web.struts2.user.UserAction
package cn.itcast.web.struts2.user;

public class UserAction {
        //表单参数
        private String username;
        private String password;
        //提供对应的setter方法(拦截器会将表单参数通过setter方法自动注入进来)
        public void setUsername(String username) {
            this.username = username;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        //注册的业务控制方法 
        public String registerMethod(){
            System.out.println("用户名:" + username);
            System.out.println("密码:" + password);
            return "success";
        }
}

/day31/src/cn/itcast/web/struts2/user/struts_user.xml(在总的文件/day31/src/struts.xml中包含)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<!-- struts2的核心配置文件,在应用部署时加载并解析 -->
<struts>
<include file="cn/itcast/web/struts2/user/struts_user.xml"/>
</struts>  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="user" extends="struts-default" namespace="/">
        <!-- action name对应form中的action -->
        <action 
            name="register" 
            class="cn.itcast.web.struts2.user.UserAction" 
            method="registerMethod">
            <result name="success" type="dispatcher">
                /WEB-INF/register_success.jsp
            </result>        
        </action>        
    </package>    
</struts> 

/day31/WebRoot/WEB-INF/register_success.jsp

  <body>
    注册成功<br/>
  </body>

对于POST请求,框架默认采用UTF-8编码方式,无需设置/day31/src/struts.properties
struts.i18n.encoding=UTF-8  类似于:request.setCharacterEncoding("UTF-8")

以上配置,只针对POST请求。
struts2框架提倡按如下原则发送请求:
A)无参使用GET,框架没提交解决方案
B)有参使用POST
(6)项目中使用POST和GET请求方式的原则
【struts2以POST或GET方式传中文参数】

在平凡中坚持前行,总有一天,会遇见优秀的自己
原文地址:https://www.cnblogs.com/mao-19/p/5707231.html