01-Servlet

Servlet:任何实现了Servlet接口的类,是用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Servlet容器:例如Tomcat服务器

1、Servlet工作原理

 1. Servlet容器将Servlet类载入内存,并产生Servlet实例和调用其具体的方法。在一个应用程序中,每种Servlet类型只能有一个实例。
 2. 用户请求致使Servlet容器调用Servlet的Service方法,并传入一个ServletRequest对象和ServletResponse对象;这两个对象都是由Servlet容器封装好的。
 3. 对于每一个应用程序,Servlet容器会创建唯一的一个ServletContext对象,封装了应用程序的环境详情。每个Servlet对象有一个封装Servlet配置的ServletConfig对象。

ServletContext和ServletConfig 详情请参考

2、Servlet的生命周期

客户端首次请求:
 1. Servlet容器解析请求,根据请求找到对应的Servlet,判断Servlet实例是否存在,不存在则创建;
 2. 调取init方法进行初始化操作;
 3. 初始化完成后调取service方法,由service方法判断客户端请求方式,get请求执行doGet(),post请求执行doPost(),处理完成后,将结果返回给客户端。单次请求完成。
客户端第二次请求:
 1. 判断对象是否存在,但是不再执行init(),而直接执行service方法,调取doGet()/doPost()方法。
服务器关闭时调取destroy()方法进行销毁。

在这里插入图片描述

3、HttpServletRequest

HttpServletRequest表示Http环境中的Servlet请求。

常用方法:
 1. String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String
	注:服务器在接收数据时使用字符串统一接收
 2. String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
 3. void setCharacterEncoding(String charset) 指定每个请求的编码(针对post请求才起作用)
 4. RequestDispatcher getRequestDispatcher(String path) --跳转页面,返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求
		request.getRequestDispatcher("../success.jsp").forward(request,response);
 5. 存值 request.setAttribute("key",value);
 6. 取值 request.getAttribute("key");//取值后需要向下转型,不能用于获取表单提交的数据。
		String a1=(String)request.getAttribute("uname");

补充:
 1. 处理请求乱码的问题:setCharacterEncoding("UTF-8");//post提交时管用
 2. 客户端发送数据给服务器:
	1)通过表单get/post提交;
	2)通过a标签发送数据(get提交);
	3)通过地址栏直接拼接get请求;
	4)js提交数据(get请求)
		location.href="目标请求?key=value&key=value"
 3. get和post的区别:
 	1)get请求的数据会暴露在地址栏中,post请求不会;
 	2)get请求传输数据会受到url长度限制,post请求不会;
 	3)post的安全性比get高,get请求提交数据时可能会造成CSRF(跨站请求伪造)攻击。

4、HttpServletResponse

HttpServletResponse用来封装HTTP响应消息。 在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。

常用方法:
 1. void addCookie(Cookie var1);//给这个响应添加一个cookie
 2. void sendRedirect(String var1) ;//发送一条响应码,将浏览器跳转到指定的位置
 3. PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
 4. setContentType() 设置响应内容的类型

5、重定向和转发

重定向:response.sendRedirect();
	地址栏会改变,request中存储的数据会丢失;
	两次请求,两次响应(地址栏修改了两次)
转发:request.getRequestDispatcher("../success.jsp").forward(request,response);
	地址栏不会改变,request中存储的数据不会丢失;
	一次请求,一次响应;

注意:
	使用js跳转页面也会丢失request中的数据。

6、session

request存的值只能在单次请求中保存,保存的数据不能跨页面,当重定向时,request存的值会丢失;
session的数据可以在多个页面中共享,即使重定向页面,数据不会丢失;
session中可以包含n个request。
会话的概念:从打开浏览器到关闭浏览器,期间访问服务器就称为一次会话。

常用方法:
 1. void setAttribute(String key,Object value) 以key/value的形式保存对象值,将数据存储在服务器端
 2. Object getAttribute(String key) 通过key获取对象值
 3. void invalidate() 设置session对象失效
 4. String getId() 获取sessionid,当第一次登录成功后,session会产生一个唯一的id,浏览器之后访问时如果发现id值还是之前id,那么说明 当前访问的属于同一个会话
 5. void setMaxInactiveInterval(int interval) 设定session的非活动时间
	方式1: session.setMaxInactiveInterval(10*60);//设置有效时间为10分钟
	方式2:修改web.xml
		<session-config>
			<session-timeout>10</session-timeout>//单位:分钟
		</session-config>
 6. int getMaxInactiveInterval() 获取session的有效非活动时间(以秒为单位),默认的有效时间:30分钟
 7. void removeAttribute(String key) 从session中删除指定名称(key)所对应的对象

猜你喜欢

转载自blog.csdn.net/rookie__zhou/article/details/111189770