获取请求体的参数的通用方法
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 对象
![]()