会话管理往往需要多次请求,因为HTTP协议是一种无状态协议,难以记忆住状态。即只要一次请求,再接一次响应之后,之前的request数据就被销毁了。但是,我们在开发的时候,要记住状态的时候很多,至少我们要跨多个请求去完成任务。比如淘宝购物车。
url重写
下面是代码的运行结果:
我们要注意的是,当我们将鼠标放在链接上面时。对应页面左下角会出现一个id,这个是客户所要访问的页面的id。
而这里因为页面不记忆id,所以每次链接访问都是客户在点击的同时,链接将id发送到了客户端上面了。


我们来看看页面的源码:
我们可以看到页面源码中保存的id,即每个蓝色连接的id后面的数字,就叫url重写。将这些id保存在url里,用其以保存页面状态。当我们想看哪一个的详细信息时,便点开其链接即可。就会再次向服务器端发出请求,获取到维护在url里的id,而客户却不知道。

UrlRewriteServlet
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.io.PrintWriter;
import java.util.List;
public class UrlRewriteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 取数据
*/
List<News> list = News.newes;
/**
* 展示成表格
*/
PrintWriter pw = resp.getWriter();
/*
*写表格
*/
//格式化为表格输出到客户端
pw.println("<table border='1'>");
for(News s : list){
pw.println("<tr>");
pw.println("<td>");
pw.println("<td>");
pw.println(s.getId());
pw.println("</td>");
pw.println("<td>");
//我们这里希望的是,
//点这个title我们能访问到详细内容,
//所以我们这里要做成链接。
/**
*url链接
*/
//我们在写了detail链接之后,
//还要将id写到url里。
pw.println("<a href='/detas?id=" + s.getId() + "'>" + s.getTitle() + "</a>");
pw.println("</td>");
pw.println("<td>");
//这里也是一个url重写,
//它是要在一个servelet里头将该数据查出来,
//然后发到表单里头去显示。
pw.println("<a href='/uis?id=" + s.getId() + "'>UPDATE</a>");
pw.println("</td>");
pw.println("</tr>");
}
pw.println("</table>");
}
}
News
import java.util.ArrayList;
import java.util.List;
public class News {
public static List<News> newes = new ArrayList<>();
//这里我们要使用静态块,否则就要把它写到构造里。
//这里的意思即类只要一加载的时候,静态的东西,
//包括该块里的东西,就会被加入到newes静态集合里。
//虽然可以用它维持页面状态,但是因为是静态的,
//我们一般不用它。
static {
newes.add(new News(1112, "aaaa", "asfasdfsadf"));
newes.add(new News(1113, "bbb", "adsfsadfsa"));
newes.add(new News(1111, "ccc", "345345"));
}
private int id;
public News(int id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
private String title;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
private String content;
}
Student
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
private String sex;
public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
}
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>UrlRewriteServlet</servlet-name>
<servlet-class>edu.xalead.UrlRewriteServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UrlRewriteServlet</servlet-name>
<url-pattern>/urs</url-pattern>
</servlet-mapping>
</web-app>
探讨了HTTP协议无状态特性下,通过URL重写实现跨请求状态保持的方法,展示了如何在Servlet中实施URL重写以维护会话状态。
1357

被折叠的 条评论
为什么被折叠?



