使用BeanUtils来将参数封装到对象中
注意:使用这个方法
1.所使用对象 必须是javabean对象
2.表单name属性 必须和对象的成员变量对应
public class Demo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
User user=new User();
try {
BeanUtils.populate(user, request.getParameterMap());
System.out.println(user);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
请求转发
浏览器接收到客户请求后,通知服务器调用另外一个web资源进行处理.称之为请求转发
一次请求 并且响应到网页是转发后的响应结果
private void fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求转发
//通过请求对象获取请求转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/demo03");
//转发
dispatcher.forward(request, response);
}
请求重定向
浏览器接收到客户请求后 返回在返回响应中会携带一个重定向响应头(头中有重定向访问网址)
浏览器接收到这个响应后 发现重定向头 再一次发起请求 去访问重定向头中的地址
两次请求 超出了Request域的作用范围不能使用request域进行传值 参数是重定向的地址
private void fun2(HttpServletResponse response) throws IOException {
//请求重定向
//两次请求 超出了Request域的作用范围不能使用request域进行传值
//参数是重定向的地址
response.sendRedirect("/sh-web-03/demo03");
}
请求包含
1.几次请求
一次请求(可以用request域传值)
2.最终响应到网页的内容是什么?
两个servlet的响应结果会一起返回给浏览器
RequestDispatcher dispatcher = request.getRequestDispatcher("/demo03");
dispatcher.include(request, response);
Request 域对象
内部也维护了一个map集合 添加获取删除值
作用范围:只对一次请求有效
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//获取响应中的字符流
PrintWriter writer = response.getWriter();
//向request域中保存个值
request.setAttribute("name", "zhangsan");
}
public class Demo03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
response.getWriter().write("456");
//从request域取值
String name = (String)request.getAttribute("name");
System.out.println(name);
System.out.println("我是demo03");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
会话技术
客户端与服务端之间的交互就是会话
什么是会话?相当于打电话
访问网页时 只要浏览器不关闭 点击多次链接 也叫一次会话 关闭浏览器 结束会话
1.客户端技术 Cookie 保存客户端(浏览器当中) 就是一个文件
每个站点(网站)可以保存20个cookie 每个浏览器可以保存300个cookie 每个cookie可以保存4kb的数据
cookie 默认的存活时间 一次会话(关闭浏览器 cookie被清除)
默认是保存在浏览器的内存当中
可以设置cookie的存活时间
浏览器就会将cookie保存到硬盘当中(保存到文件中) 注意:cookie不能保存中文
设置cookie的存活时间
setMaxAge(时间 以秒为单位)
正值 值是多少 浏览器就保存多少秒 负值 浏览器不会存储cookie到硬盘当中
当浏览器关闭 会话结束 这个cookie被删除 0时 cookie被删除
2.服务端技术 HttpSession
Session是保存在服务端的
第一次访问界面的时候 是没有cookie的
需求:显示上一次(最后)的登录时间
(关闭浏览器之后 再访问还能显示)
第一次访问servlet时 将时间保存到cookie
在响应回浏览器 让浏览器储存起来 下一次在访问时 通过request请求
获取之前保存的cookie 显示之前储存时间就行了
public class Demo04 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//接到请求先读取cookie
//获取请求的cookie
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
//遍历cookie的数组
for (Cookie cookie : cookies) {
//找出之前保存的cookie按名字
if (cookie.getName().equals("lastTime")) {
//获取cookie的值
String value = cookie.getValue();
//将字符串转化成long型
long time = Long.parseLong(value);
//转换成时间
Date date=new Date(time);
//转换时间的格式(格式化时间)
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
//格式化date对象
String lastTime = dateFormat.format(date);
//写到网页上
response.getWriter().write("上次的登录时间:"+lastTime);
}
}
}
//创建一个cookie对象
Cookie cookie=new Cookie("lastTime", System.currentTimeMillis()+"");
//设置cookie的保存路径
// "/"表示该工程下的所有都能访问
//保存时 相当于按工程名来存
// "/sh-web-03/servlet"
//相当于之后 servlet目录下的网页能访问
cookie.setPath("/sh-web-03/servlet");
//设置cookie的存活时间
cookie.setMaxAge(60*5);
//添加cookie到响应中
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Demo05中获取Demo04中设置的时间时 该时间不会改变 因为demo05中只有时间的获取 没有时间的设置
public class Demo05 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//接到请求先读取cookie
//获取请求的cookie
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
//遍历cookie的数组
for (Cookie cookie : cookies) {
//找出之前保存的cookie按名字
if (cookie.getName().equals("lastTime")) {
//获取cookie的值
String value = cookie.getValue();
//将字符串转化成long型
long time = Long.parseLong(value);
//转换成时间
Date date=new Date(time);
//转换时间的格式(格式化时间)
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
//格式化date对象
String lastTime = dateFormat.format(date);
//写到网页上
response.getWriter().write("上次的登录时间:"+lastTime);
}
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
例题:登录后 下次再打开浏览器 还能记录用户名
public class Demo06 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String username="";
String remember="";
//读取cookie
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
//遍历
for (Cookie cookie : cookies) {
//找出username的cookie
if (cookie.getName().equals("username")) {
//System.out.println(cookie.getValue());
username=cookie.getValue();
remember="checked='checked'";
}
}
}
response.getWriter().write("<form action='/sh-web-03/servlet/demo07' method='post'>");
response.getWriter().write("用户名<input type='text' name='username' value='"+username+"'><br/>");
response.getWriter().write("密码<input type='text' name='password'><br/>");
response.getWriter().write("记住<input type='checkbox' name='remember' "+remember+">");
response.getWriter().write("<input type='submit' value='提交'>");
response.getWriter().write("</form>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class Demo07 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
//处理登录的请求(获取表单提交的数据)
String username = request.getParameter("username");
String password = request.getParameter("password");
String remember = request.getParameter("remember");
//创建cookie
Cookie cookie=new Cookie("username", username);
//设置一下cookie路径
cookie.setPath("/sh-web-03/servlet");
//判断账户wanglong 密码123 就算登录成功
if (username.equals("wanglong")&&password.equals("123")) {
//登录成功
//点记住 保存cookie 设置存活时间
//没点记住 把cookie删了 存活时间为0
//单选框 选中状态 返回的是on 不选中 返回null
if (remember!=null) {
//设置存活时间
cookie.setMaxAge(Integer.MAX_VALUE);
}else {
//存活时间为0
cookie.setMaxAge(0);
}
//显示登录成功
response.getWriter().write("登录成功");
//响应中添加cookie
response.addCookie(cookie);
}else {
//登录失败 3秒返回登录页面
response.getWriter().write("登录失败");
response.setHeader("refresh", "3;url=/sh-web-03/servlet/demo06");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}