JavaEE 中的 Servlet

servlet

servlet 全称为 server applet。用于编写Java服务器,利用实现servlet接口的类,完成客户端与服务器之间的交互。

工作流程:

  1. (第一次发送请求)客户端发送请求给服务器
  2. servlet容器对客户端请求进行解析
  3. servlet 实例化,初始化
  4. 调用 servlet 的 service() 方法 返回请求的对应响应给servlet容器
  5. servlet容器返回相应给客户端
  6. (后续请求)直接调用 service() 方法
  7. (结束相应)调用 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方法更常用,原因如下:

  1. 数据提交后,get方法会把输入的信息都写在url中,而post不会。post提交的信息会打包在http请求包的包体中。
  2. 虽然http协议对于url的长度没有限制,但实际开发中,url的长度在某些时候会受到限制。post在url方面不会收到限制(某些情况下,post传输的数据量也会收到限制)。
  3. 因为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");
	}

转发跳转(一次请求,一次响应)

Client Server 发送 /test 请求 返回/display.html Client Server

请求包含页面地址,还有页面内容,url 的呈现为:

localhost:8080/test

重定向跳转(两次请求,两次响应)

Client Server 发送 /test 请求 返回/display.html 发送 /display.html 返回具体页面内容 Client Server

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也失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值