• (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方式传中文参数】

    在平凡中坚持前行,总有一天,会遇见优秀的自己
  • 相关阅读:
    海量数据处理:十道面试题与十个海量数据处理方法总结
    C++中的static及内存分配
    面试时如何向面试官提问
    面试题3:斐波那契数列与爬楼梯
    面试题1:二进制中1的个数
    面试题:单链表的几种处理
    js网页下载csv格式的表格
    解决背景图文字盖住html里面的dom元素
    使用element-ui的常见问题
    Promise-async-await处理函数
  • 原文地址:https://www.cnblogs.com/mao-19/p/5707231.html
Copyright © 2020-2023  润新知