6.7 HttpServletRequest
获取参数,请求转发
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
爱好:
<input type="checkbox" name="hobbies" value="跳舞">跳舞
<input type="checkbox" name="hobbies" value="唱歌">唱歌
<input type="checkbox" name="hobbies" value="看电影">看电影
<br>
<input type="submit">
</form>
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//处理请求
String username=req.getParameter("username");
String password=req.getParameter("password");
String hobbys[]=req.getParameterValues("hobbies");
System.out.println(username+":"+password);
System.out.println(Arrays.toString(hobbys));
//通过请求转发
req.getRequestDispatcher("success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7 Cookie、Session
7.1 会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:一个同学来过教室,下次过来,我们会知道他曾经来过,称之为有状态会话
一个网站,怎么证明你来过
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以:cookie
2.服务器登记你来过了,下次你来的时候,服务器匹配你:session
7.2 保存会话的两种技术
cookie:客户端技术,响应,请求
session:服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在session中
常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就上去了
7.3 cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
Cookie[] cookies=req.getCookies();//获取cookie
cookie.getName()//获取cookie中的key
cookie.getValue()
//新建一个cookie
new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie有效期
cookie.setMaxAge(24*60*60);
//响应给客户端一个cookie
resp.addCookie(cookie);
cookie:一般会保存在本地的用户目录下appdata
例子
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class Cookie1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("gbk");
PrintWriter out=resp.getWriter();
//从客户端获取cookie
Cookie[] cookies=req.getCookies();
//判断cookies是否存在
if(cookies!=null)
{
out.write("您上一次访问时间是");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie=cookies[i];
if(cookie.getName().equals("lastLoginTime"))
{
long lastLoginTime=Long.parseLong(cookie.getValue());
Date date=new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}
else
{
out.write("这次您第一次访问本站!");
}
//服务器给客户端响应一个cookie
Cookie cookie=new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie有效期
cookie.setMaxAge(24*60*60);
//响应给客户端一个cookie
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
一个网站cookie是否存在上限
一个cookie只能保存一个信息
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
cookie大小限制4kb
300个cookie浏览器上限
删除cookie:
不设置有效期,关闭浏览器自动失效
设置有效时间为0
编码解码
String str=URLEncoder.encode("test","utf-8");
URLDecoder.decode("str","utf-8");
7.4 session
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class Session1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//得到session
HttpSession session=req.getSession();
//给session中存东西
session.setAttribute("name","小明");
//获取session的Id
String id=session.getId();
//判断session是不是新创建
if(session.isNew())
{
resp.getWriter().write("创建session成功,id为"+id);
}else{
resp.getWriter().write("session已经在服务器中存在了,id为"+id);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>cookie</servlet-name>
<servlet-class>Cookie1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookie</servlet-name>
<url-pattern>/cookie</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>session1</servlet-name>
<servlet-class>Session1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session1</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
</web-app>
session.getAttribute("name");
//手动注销session
session.invalidate();
//移除session中的属性
session.removeAttribute("name");
//session第一次创建时,会创建一个cookie保存session的id
Cookie cookie=new Cookie("JSESSION",id);
resp.addCookie(cookie);
session和cookie的区别
cookie是把用户的数据写给用户的浏览器,浏览器保存,可以保存多个
session是把用户的数据写到用户独占session中,服务器端保持(保存重要的信息,减少服务器资源的浪费)
session对象有服务创建
使用场景
保存一个登录用户的信息
购物车信息
在整个网站中经常会使用的数据
<!-- 设置session的失效时间-->
<session-config>
<!--15分钟后session自动失效,分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
当服务器中的servlet执行request.getSession();时如果没有JsessionID或没有id相匹配的session时会创建一个session同时生产一个id并将这个id存到cookie写到用户浏览器中。当用户再次访问服务器时就会带上这个cookie的id.此时服务器在用这个id与内存中的session进行匹配。匹配成功即可使用这个session来服务