4-27 请求参数的通用方法/请求转发/共享数据/获取ServletContext

 获取请求体的参数的通用方法 

  1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
                1. String getParameter(String name):根据参数名称获取参数值   

例如username=zs&password=123  参数写入username 会返回zs的字符串
                2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 

例如 hobby=study&hobby=game(键相同值不同)   多用于复选框 得到一个String数组
                3. Enumeration<String> getParameterNames():获取所有请求的参数名称 

得到的是枚举类型
                4. Map<String,String[]> getParameterMap():获取所有参数的map集合  键和值都获取出来存在map集合中      为什么<String,String[]> 是为了兼容上面2中的情况

方法演示

这里就是post 或者get方法都可以用了

package cn.itcat.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

//注意这里时获取参数   请求体的参数
@WebServlet( "/demo10")
public class RequestDemo10 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println(username);



        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }



        Enumeration<String> parameterNames = request.getParameterNames(); //出现了枚举就要用hasMoreElement()  nextElement()方法来
        while(parameterNames.hasMoreElements()){
            String name = parameterNames.nextElement();
            System.out.println(name);
            String value = request.getParameter(name);
            System.out.println(name+":"+value);  //因为getParameter();方法只能获取一个参数值所以复选框选了俩但是只有一个会被打印
            System.out.println("=======");
        }


        Map<String, String[]> parameterMap = request.getParameterMap(); //名字和值都拿出来 封装到一个Map集合中  String[]避免了复选框获取不到
        //map遍历 keySet();方法
        Set<String> keySet = parameterMap.keySet();
        for (String name : keySet) {
            //根据key键来获取值
            System.out.println(name);
            String[] values = parameterMap.get(name); //注意这是一个数组
            for (String value : values) {
                System.out.println(value);
                System.out.println("------");
            }
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request,response);  //这样就两个代码一样了
    }
}

html:

 

中文乱码问题:

获取参数就是获取请求体的参数

  * 中文乱码问题:
                    * get方式:tomcat 8 已经将get方式乱码问题解决了
                    * post方式:会乱码
                        * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

get: 如果在html表单form标签设置get不会出现下面的中文乱码问题

post: 输入中文会乱码 英文不乱码  

解决:

加一行代码request.setCharacterEncoding("utf-8");    ("  ")中的内容跟着html中的下图的文字格式来

 加了这行代码request.setCharacterEncoding("utf-8"); 就不会出现post提交中文乱码问题

请求转发 :   请求转发和数据共享也时不一样的

一种在服务器内部的资源跳转方式  使每一个servlet的功能细化

如下图  Aservlet完成一部分工作   再跳转到Bservlet完成一部分工作

  1. 步骤:
         1. 通过request对象获取请求转发器对象RequestDispatcher:

RequestDispatcher getRequestDispatcher(String path--转发资源的路径好比/demo01)
          2. 使用转发器RequestDispatcher对象中的forward来进行转发:

forward(ServletRequest request, ServletResponse response) 

两行代码结合

req.getRequestDispatcher("/RequestDemo10").forward(req,resp); 
 //一行代码做到请求转发  绿色的内容要看具体的参数名称

两个Demo   注意dopost 和 doget都要写东西

 

 

客户端发送一个请求间接访问了两个资源 

输出:demo12被访问了  demo13被访问了

 

         2. 特点:
                    1.如上图虽然访问了RequestDemo12 和RequestDemo13但是 浏览器地址栏路径不发生变化
                    2. 只能转发到当前服务器内部资源中。 只能访问服务器项目内部 就好比不能访问百度
                    3. 转发是一次请求  就是只发了一个请求给demo12  但是两个资源同时被访问了,多个资源使用的是同一个请求
 

 3. 共享数据(域对象)

涉及数据转发呢就涉及到数据通信好比servletA告诉B自己干到哪了(数据通信共享)
                * 域对象:一个有作用范围的对象,可以在范围内共享数据
                * request域(就是域对象):代表一次请求的范围,结构图servletA和B在一次请求的范围内,request域一般用于请求转发的多个资源中共享数据

    * 方法:如何实现数据共享? request提供了三种方法  
                    1. void setAttribute(String name,Object obj):存储键值对存储数据 设置的是键值对
                    2. Object getAttitude(String name):通过键获取值
                    3. void removeAttribute(String name):通过键移除键值对
代码:

 

 

 输出:

 4. 获取ServletContext:
                * ServletContext    getServletContext()   返回值是ServletContext 对象

 

 

 

 


             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值