获得客户端请求参数(客户端提交的数据)
- getParameter(name)方法
- getParameterValues(String name)方法 获取一个参数的多个值
- getParameterNames方法
- getParameterMap方法 //做框架用,非常实用
- getInputStream
package com.zx.web.servlet; import java.io.IOException; import java.util.Enumeration; import java.util.Map; import java.util.Map.Entry; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Lesson01Servlet") public class Lesson01Servlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub /*Enumeration<String> e= requset.getParameterNames(); while (e.hasMoreElements()) { System.out.println(e.nextElement()); }*/ Map<String, String[]> map= requset.getParameterMap(); for (Entry<String,String[]> entry:map.entrySet()) { System.out.println("参数名字:"+entry.getKey()); System.out.print("参数的值: "); for (String value:entry.getValue()) { System.out.println(value); } } } }
获取表单数据1
package com.zx.web.servlet.lesson02; import java.io.IOException; import java.util.Arrays; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Lesson02Servlet") public class Lesson02Servlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String username=req.getParameter("username"); String password=req.getParameter("password"); String gender=req.getParameter("gender"); String remark=req.getParameter("remark"); String[] hobbies = req.getParameterValues("hobby"); System.out.println(username); System.out.println(password); System.out.println(gender); System.out.println(remark); System.out.println(Arrays.toString(hobbies)); } }
<!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> <!-- 表单的请求有get/post两种方式 , 默认是get请求,如果是这样的话,在后台Servlet要写doGet方法 如果是post请求,后台要写post方法 --> <form action="/day10Web/Lesson02Servlet"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> 性别: <input type="radio" name="gender" value="male">男 <input type="radio" name="gender" value="female">女 <br> 爱好: <input type="checkbox" name="hobby" value="学习">学习 <input type="checkbox" name="hobby" value="赚钱">赚钱 <input type="checkbox" name="hobby" value="游戏">游戏 <input type="checkbox" name="hobby" value="玩耍">玩耍<br> 备注: <textarea rows="5" cols="50" name="remark"></textarea><br> <input type="submit" value="提交"> </form> </body> </html>
post请求时,中文会乱码,解决方法setCharacterEncoding,只针对post有效
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub //post请求时,中文会乱码,解决方法 req.setCharacterEncoding("UTF-8");//只针对post 请求 String username=req.getParameter("username"); String password=req.getParameter("password"); String gender=req.getParameter("gender"); String remark=req.getParameter("remark"); String[] hobbies = req.getParameterValues("hobby"); System.out.println(username); System.out.println(password); System.out.println(gender); System.out.println(remark); System.out.println(Arrays.toString(hobbies)); }
get和post请求的区别:
- get请求是把请求参数放在url?后面进行拼接,
- post请求在url中是看不到参数
- post请求比较安全点
getInputStream【获取不到参数】-----针对post请求有效
使用InputStream读取数据时,发现中文变成百分号形式
post请求会对中文进行URL编码【中文变成百分号形式】
【url解码】:百分号形式变成中文
反射:当一个字节码文件加载到内存的时候,jvm会对该字节码j进行解剖,然后会创建y一个对象的class对象,把字节码文件的信息全部存储到该Class对象中,我们只要获取到Class对象,就可以使用很多操作
获取class对象方式一:Class.forName("包名.类名")
获取Class对象方式二:通过类名获取 类名.Class
获取Class对象方式三:通过对象获取 new 类名().getClass();
在反射中,如果想要获取到私有的东西,需要在get上加Declared即可
invoke 执行方法,第一个参数:执行的对象,第二个参数:方法需要的参数
获取表单二:
package com.zx.web.servlet.lesson04; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Map; import java.util.Map.Entry; 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 org.apache.commons.beanutils.BeanUtils; import com.zx.web.model.User; @WebServlet("/Lesson04Servlet") public class Lesson04Servlet extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub req.setCharacterEncoding("UTF-8"); User user=new User(); try { BeanUtils.populate(user, req.getParameterMap()); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(user); } }
重定向:需要添加一个项目路径=上下文路径
forward:假设是Servlet1转发给Servlet2,只有2的数据可以响应给客户端(浏览器)
include:也是请求转发,假设是Servlet1转发给Servlet2,1和2的数据都可以响应给客户端(浏览器)
转发地址栏不变,重定向地址栏改变
post请求有请求体,get请求没有请求体,因为参数在url后面
maxAge:cookie的缓存时间。默认是-1,默认存在浏览器的缓存中。单位是秒
- 负数:表示cookie的数据存在浏览器缓存中
- 0:表示删除cookie
- 正数:缓存在持久化磁盘上的时间
package com.zx.web.servlet.lesson09; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Map; import java.util.Map.Entry; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import com.zx.web.model.User; @WebServlet("/Lesson09Servlet") public class Lesson09Servlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub //Cookie应用场景:记录上次访问时间 //设置响应时乱码的问题 resp.setHeader("content-type", "text/html;charset=utf-8"); //获取请求头的Cookie Cookie[] cks=req.getCookies(); if (cks!=null) { for(Cookie c:cks) { System.out.println(c.getName()+":"+c.getValue()); resp.getWriter().write("上次访问的时间:"+c.getValue()); } } //1.创建一个Cookie对象 Cookie cookie=new Cookie("lastAccessTime", System.currentTimeMillis()+""); //2.设置cookie的存活时间【单位是秒】 cookie.setMaxAge(60*20); //3.把Cookie返回给客户端【通过响应头传给客户端】 resp.addCookie(cookie); } }
Cookie细节
- 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
- 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
- 在setMAxAge(0)后还要加上response》addCookie(c)的,要响应回去,才能生效
记住用户名详解
Servlet返回给客户端的数据可以是html标签数据,也就是可以write(“<a></a>”)
常识:从客户端/浏览器获取的所有数据都是字符串类型
查看书的浏览记录