servlet
servlet 全称为 server applet。用于编写Java服务器,利用实现servlet接口的类,完成客户端与服务器之间的交互。
工作流程:
- (第一次发送请求)客户端发送请求给服务器
- servlet容器对客户端请求进行解析
- servlet 实例化,初始化
- 调用 servlet 的 service() 方法 返回请求的对应响应给servlet容器
- servlet容器返回相应给客户端
- (后续请求)直接调用 service() 方法
- (结束相应)调用 destroy() 方法销毁servlet实例。
每种servlet类型只有一个实例。
servlet 继承关系
Interface Servlet -> abstract GenericServlet -> abstract HttpServlet
-
Interface Servlet 仅提供了5个基本方法:
- 1.init()
- 2.getServletConfig()
- 3.service()
- 4.getServletInfo()
- 5.destroy()
前后端交互
常见类名
类名 | 注解 |
---|---|
HttpServletRequest | 请求对象 |
HttpServletResponse | 响应对象 |
ServletContext | 全局对象 |
前后端数据传输
前台给后台传数据 request.getParameter(String name);
后台给后台传数据 request.setAttribute(String name, String value);
这些方法写在doGet()
/doPost()
,就可以实现前后端的交互。
Get / Post 区别
对于html表单操作,可以使用 get 和 post,post方法相对于get方法更常用,原因如下:
- 数据提交后,get方法会把输入的信息都写在url中,而post不会。post提交的信息会打包在http请求包的包体中。
- 虽然http协议对于url的长度没有限制,但实际开发中,url的长度在某些时候会受到限制。post在url方面不会收到限制(某些情况下,post传输的数据量也会收到限制)。
- 因为get方法是url传值,所以安全性会受到挑战。比如:账号名,密码的传值。
跳转页面
如果跳转界面的路径(A)与请求路径(B)一致,相对路径A可以省略B部分:A: /hello/page.jsp
& B: /hello/login
=> A可以写成: page.jsp
html 界面
<-- hello.html -->
<html>
<head></head>
<body>
<form action="test" method="post">
<input type="submit" value="Submit">
</form>
</body>
</html>
<-- display.html -->
<html>
<head></head>
<body>
<h1>hello world</h1>
</body>
</html>
web.xml 中加入这段代码
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
src/web/HelloServlet.class中
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 利用转发跳转:如果跳转界面的路径(A)与请求路径(B)一致,相对路径A可以省略B部分
request.getRequestDispatcher("/display.html").forward(request, response);
// 利用重定向方式跳转: 重定型会丢失request中的数据
response.sendRedirect("/display.html");
// 设置相应内容
response.setContentType("text/html");
response.getWriter().println("success");
}
转发跳转(一次请求,一次响应)
请求包含页面地址,还有页面内容,url 的呈现为:
localhost:8080/test
重定向跳转(两次请求,两次响应)
url 的呈现为:
localhost:8080/display.html
会话 Session
// 获取session对象
HttpSession session = request.getSession();
session.setAttribute("haha", "hello world");
session.getAttribute("haha");
// 设置session的超时时间
session.setMaxInactiveInterval(10); // 单位是秒
session.getMaxInactiveInterval();
// session 失效
session.invalidate();
session 中存的内容储存在服务器端。可以在多个页面中拿到,但是会占服务器资源。所以不要把所有的变量都往session中存。
cookie 是session的一种,其中的数据储存在客户端,不会占用服务器资源。
但是通常情况认为cookie不可靠,cookie是保存在本机上的,其信息完全可见且易于编辑。Session是可靠的。
session是由应用服务器维持的一个服务器端的储存空间。用户连接服务器时,服务器会生成一个sessionID。(unique id)这个id由cookie保存。提交界面时会把sessionID一起提交倒服务器。如果禁用cookie则,session也失效。