关于JavaWeb中Servlet的总结
- Servlet知识结构图

Servlet是JavaWeb服务器端的程序,一般一个Servlet处理一种特定的请求。Servlet编写好后,需要指定其所处理的请求的请求路径,也可以认为Servlet是一种虚拟资源,可被客户端请求
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Writer writer = response.getWriter();
writer.append("Hello Java Web !");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Servlet接口被定义用来处理客户端发来的请求,又针对HTTP协议提供了子类HttpServlet处理HTTP请求。也就是说Servlet在顶层设计上可以处理各种协议的请求,只不过目前仅仅应用在HTTP请求上
由于HTTP协议中请求方式主要有get和post,HttpServlet中就定义了doGet()和doPost()分别处理这两种方式的请求。不过一般的业务逻辑使用get或者post都可以,而且处理方式一样,所以一般都在一个方法中调用另一个方法,比如在doPost()中调用doGet()
- servlet工作原理

- 虚拟路径
web 3.0版本之后,可以使用@WebServlet注解指定Servlet的虚拟路径,比如@WebServlet("/test"),注意必须以斜线开头。项目启动时会扫描所有的@WebServlet注解并管理起来,可以为Servlet指定多个虚拟路径,比如@WebServlet({ "/test", "/test1", "/test2" })
虚拟路径支持通配符,比如 /user/* 、*.do ,但是不能是/user* 、/*.do等
特别的,使用单个 / 可以匹配所有请求
- Servlet对象的创建时机
Servlet对象默认会在第一次被请求时创建,也可以通过配置让服务器启动时就创建Servlet对象
@WebServlet(urlPatterns = "/test", loadOnStartup = 1)
public class TestServlet extends HttpServlet { @Override
public void init() throws ServletException {
System.out.println("Servlet进行初始化");
}
当指定loadOnStartup时Servlet对象就会在服务器启动时创建,取值为自然数,而且值越小优先级越高
- request请求对象
HttpServletRequest request是请求对象,内部封装了客户端请求的各种信息,主要有请求路径、请求参数、请求头、cookie等
|
request的方法 |
说明 |
|
getRequestURI() |
获得请求路径及其后面的查询字符串(不包括主机和端口) |
|
getParameter(name) |
获得以键值对形式提交的请求参数的值 |
|
getHeader(name) |
获得请求头信息 |
|
getPart(name) |
获得上传的文件 |
|
getCookies() |
获得随请求上传的cookie信息 |
- response响应对象
HttpServletResponse response是响应对象,专门用来生成响应
|
response的方法 |
说明 |
|
setContentType(type) |
设置响应类型 |
|
getWriter() |
获得Writer以便生成文本响应 |
|
getOutputStream() |
以便生成字节响应,比如文件下载等 |
|
sendRedirect(location) |
直接生成重定向响应 |
|
addCookie(cookie) |
在响应中添加cookie以便发送给客户端 |
- <form>表单中请求路径的写法
一定要明白<form>表单是显示在客户端浏览器上的,也就是说<form>表单是客户端的东西,不属于服务器(虽然是从服务器获得的)
相对路径(不以斜线开头的路径)
相对路径是相对于当前浏览器地址栏路径来说的,即在地址栏父路径的基础上拼接相对路径,比如地址栏中路径为http://localhost:8080/webDemo/register.html ,那么<form action="register" 中的相对路径register就表示http://localhost:8080/webDemo/register ,他们的父路径相同
绝对路径(以斜线开头的路径)
绝对路径开头的斜线表示根路径,关键要明白根路径的含义
对于<form action="/webDemo/register",根路径表示服务器地址,即http://localhost:8080/ ,所以后面需要跟上项目名称webDemo
当然,如果直接<form action="http://localhost:8080/webDemo/register" 写全路径也可以
- 转发和重定向
转发我们已经熟悉了,可以达到重用request中现有数据的效果
重定向,即response.sendRedirect("/userDemo/login.jsp") ,生成的响应信息为
|
HTTP/1.1 302 Found Location: /userDemo/login.jsp |
浏览器收到这个响应后就会重新访问Location指定的URL,所以URL是在客户端生效,所以斜线后面需要加上项目名称
重定向时会再次发送新的请求,这样一共就有2个请求,对服务器来说,第一个request里面的数据就不能再用了
重定向还有个效果就是会修改浏览器地址栏的URL
一般情况下,如果需要使用当前request中的数据就使用转发,如果想修改地址栏URL就使用重定向
如果既想使用当前request数据,又想修改地址栏URL,可以使用URL重写技术,也就是把request中的数据取出来拼接到URL后面,这样重定向时浏览器再次请求时就会以请求参数的方式携带这些数据
- cookie
cookie技术可以把一些键值对数据存放到客户端电脑上,方便实现一些功能效果
cookie生效分为两个过程
1 服务器收到请求后,可以创建cookie信息,然后把cookie以响应头的方式发生给浏览器,浏览器收到响应后,就会把响应头中cookie信息保存到本地文件中
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cookie = new Cookie("email", "a@xxx.com");
cookie.setMaxAge(60 * 60 * 24 * 7);//设置最大存活时间,单位秒
response.addCookie(cookie);
}
maxAge设置cookie在客户端存活时间,单位秒,默认以及设置负值表示存活到浏览器关闭,0表示立即删除
响应信息
|
HTTP/1.1 200 OK Set-Cookie: email="a@xxx.com"; Version=1; Max-Age=604800; Expires=Wed, 27-Sep-2017 07:01:02 GMT |
2 浏览器再次发送请求时,就会把本地文件中存储的cookie信息放入请求头中发送回服务器,服务器就可以取出请求头中的cookie做一些事情
请求信息
|
GET /webDemo/processCookie HTTP/1.1 Cookie: email="a@xxx.com" |
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
}
}
}
可见,对于cookie来说,客户端只是暂存的地方,主要由服务器创建和使用
cookie一般用来实现记住用户名、自动登录、记住用户网站风格设置等
- session
session表示会话,表示客户端和服务器的一次“连接”,即从用户打开浏览器访问网站开始,到用户关闭浏览器为止,就是一个session,期间所有对该网站的访问都属于同一个session
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name"); HttpSession session = request.getSession();
session.setAttribute("name", name);
}
session在Servlet中表现为HttpSession的对象,session对象不应该手动创建,某用户第一次调用request.getSession()时,服务器会创建出session对象,之后再次调用时,就会返回同一个session对象
session对象主要是作为web域对象来使用的,应该存放那些在多个请求之间都有效的数据,比如用户登录成功后把user对象存放到session中,这样后面再请求时,servlet就可以从session中取出user的数据直接使用
session中还有一个比较重要的是sessionId,每个会话都会对应一个session对象,每个session对象都会拥有一个唯一sessionId,这个sessionId就是用来区分不同用户会话的
session的实现借助了cookie技术,当创建session对象后,服务器会把session对象保存到一个map中,并且会把sessionId以cookie的形式发送到客户端,这样后面的请求都会携带这个sessionId cookie,服务器就会根据cookie里面的sessionId到map中去到对应的session对象
创建session时的响应信息
|
HTTP/1.1 200 OK Set-Cookie: JSESSIONID=74D7E93D031B34EDE9FD0D8EC652140D; Path=/webDemo/; HttpOnly |
以后再请求时的请求信息
|
GET /webDemo/session HTTP/1.1 Cookie: JSESSIONID=74D7E93D031B34EDE9FD0D8EC652140D; email="a@xxx.com" |
默认session对象的最大空闲时间是30分钟,也就是说用户如果30分钟内没有再次访问网站,服务器就会销毁该用户对应的session对象,如果30分钟后再次访问时,服务器会创建新的session,新的sessionId cookie也会覆盖原来的cookie
- ServletContext
ServletContext是Servlet的上下文对象,即管理着Servlet所处的环境,其实代表整个web项目
|
getContextPath() |
返回项目名称(项目的虚拟路径),比如 /webDemo |
|
getMimeType("a.txt") |
根据后缀名确定文件的MIME类型,比如text/plain |
|
getResourceAsStream("/el.jsp") |
返回项目内部资源的读取流 |
|
getRealPath("/el.jsp") |
获取项目内部资源文件的真实全路径,比如D:\apache-tomcat-8.0.36\wtpwebapps\webDemo\el.jsp |
另外ServletContext还作为web域对象,存储那些生命周期在服务器工作期间都有效的数据。但尽量不要把数据存放到该域对象中,因为如果用户量很多同时访问里面的数据时就会严重降低服务器性能
- Servlet的线程安全问题
每个Servlet只会创建一个对象,servlet对象可以同时处理多个请求,理论上Servlet的数据字段存在线程安全问题,但是进行线程同步会大大降低处理效率,所以为了避免线程安全问题并且不降低处理效率,就不能也不应该在Servlet内定义数据字段(其他非数据字段时可以的,比如service类型的字段)
关于JavaWeb中Servlet的总结的更多相关文章
- JavaWeb中servlet读取配置文件的方式
我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...
- javaWeb中 servlet 、request 、response
1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个S ...
- javaWeb中servlet开发(4)——servlet跳转
servlet跳转 1.跳转类型 客户端跳转:跳转后地址栏改变,无法传递request范围内属性,是在所有的操作都执行完毕之后才发生跳转的操作,跳转语法是,response.sendRedict() ...
- javaWeb中servlet开发(3)——Servlet生命周期
生命周期:是一个程序的存在周期,servlet由于是受容器的管理,所以容器来决定其生命周期 1.servlet生命周期 2.servlet生命周期对应的方法 3.servlet生命周期代码 publi ...
- javaWeb中servlet开发(2)——servlet与表单
1.重写doGet方法 public class InputServlet extends HttpServlet{ public void doGet(HttpServletRequest req, ...
- javaWeb中servlet开发(1)——helloworld
1.servlet 1.1 servlet简介 1.2 servlet流程 不管是servlet还是jsp,所有的程序都是在服务器端处理的,所以必须了解一个servlet基本流程 servlet和JS ...
- javaWeb中servlet开发——监听器
监听的定义 对application的监听 application是servletContext接口的对象,表示的是整个上下文环境,如果要想实现对application监听则可以使用如下两个接口: s ...
- javaWeb中servlet开发——过滤器
servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...
- JavaWeb中Servlet和JSP的分工案例
jsp和Servlet的分工: * JSP: > 作为请求发起页面,例如显示表单.超链接. > 作为请求结束页面,例如显示数据. * Servlet: &g ...
随机推荐
- 实验吧-杂项-MD5之守株待兔(时间戳&python时间戳函数time.time())
其实也有点蒙圈,因为从没做过和时间戳有关的题. 打开网站,将系统密钥解密得到一串值,而自己的密钥解密是空的,既然说是要和系统匹配,就把解密得到的值以get方式送出去. 但是发现还是在自己的密钥也发生了 ...
- 我们是如何将 ToB 服务的交付能力优化 75%?
ToB 服务交付的方式分为公有云部署和私有化部署两种.其中,对成本敏感的中小企业往往采用公有云部署的方式,从而尽量减少成本.客单价较高的大型企业.政府.银行和事业单位,考虑到数据隐私.安全.合规等要求 ...
- 创建一个简单的Spring应用
环境已经安装完成,接下来创建一个简单的Spring应用. 创建Spring应用步骤: 创建一个maven项目 添加spring库依赖 创建Bean类 添加Bean的xml装配文件 创建主类 运行应用程 ...
- kafka的编程模型
1.kafka消费者编程模型 分区消费模型 组(group)消费模型 1.1.1.分区消费架构图,每个分区对应一个消费者. 1.1.2.分区消费模型伪代码描述 指定偏移量,用于从上次消费的地方开始消费 ...
- POJ 1320:Street Numbers
Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2753 Accepted: 1530 De ...
- ES6 - 装饰器 - Decorater
注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时.这意味着,修饰器能在编译阶段运行代码.也就是说,修饰器本质就是编译时执行的函数. 修饰器是一个对类进行处理的函数.修饰器函 ...
- ios 进阶技术点
1.Runtime的消息转发机制 消息转发机制基本上分为三个步骤: 1. 动态方法解析 2. 备用接收者 3. 完整转发 2.Runloop的工作原理 runloop.autorelease pool ...
- (排序)P1177 【模板】快速排序
题解: 这道题用传统快排(如下所示)的结果就是最后三个点TLE: 如果永远取第一个元素作为枢轴的话,在数组已经有序的情况下每次划分都将得到最坏的结果,时间复杂度退化为O(n^2).因为其中一个子序列每 ...
- 51nod 1267:4个数和为0 哈希
1267 4个数和为0 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出&qu ...
- ref与out区别
ref与out out.ref都是传递引用(内存地址),使用后都将改变原来参数的数值. ref 当调用方法时,在方法中会对ref传入的参数数值进行改变,若使用ref参数,则方法定义和调用方法都 ...