Servlet知识结构图

Servlet是JavaWeb服务器端的程序,一般一个Servlet处理一种特定的请求。Servlet编写好后,需要指定其所处理的请求的请求路径,也可以认为Servlet是一种虚拟资源,可被客户端请求

@WebServlet("/test")public class TestServlet extendsHttpServlet {

@Overrideprotected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

Writer writer=response.getWriter();

writer.append("Hello Java Web !");

}

@Overrideprotected voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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 extendsHttpServlet {

@Overridepublic void init() throwsServletException {

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以便发送给客户端

表单中请求路径的写法

一定要明白

表单是显示在客户端浏览器上的,也就是说表单是客户端的东西,不属于服务器(虽然是从服务器获得的)

相对路径(不以斜线开头的路径)

相对路径是相对于当前浏览器地址栏路径来说的,即在地址栏父路径的基础上拼接相对路径,比如地址栏中路径为http://localhost:8080/webDemo/register.html ,那么

绝对路径(以斜线开头的路径)

绝对路径开头的斜线表示根路径,关键要明白根路径的含义

对于

当然,如果直接

转发和重定向

转发我们已经熟悉了,可以达到重用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信息保存到本地文件中

@Overrideprotected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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"

@Overrideprotected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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

@Overrideprotected voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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类型的字段)

java中的servlet_关于JavaWeb中Servlet的总结相关推荐

  1. java list jstl_详解javaweb中jstl如何循环List中的Map数据_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 详解javaweb中jstl如何循环List中的Map数据 第一种方式: 1:后台代码(测试) List> lis ...

  2. java脏字过滤_分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤...

    案例1. 利用Servlet的过滤器Filter进行完成脏话过滤 package cn.javabs.filter; import java.io.IOException; import javax. ...

  3. java 文件上传格式,javaweb中的文件上传(以2进制格式上传)

    html:前台:简单的一个上传界面,可以浏览上传的文件,可以上传各种文件,前台没有验证,如过需要安全验证,可以在js中加验证 abc.jsp: js: function imp(){ var form ...

  4. java web中的导出excel_JAVA语言之怎么在JavaWeb中导出Excel

    本文主要向大家介绍了JAVA语言之怎么在JavaWeb中导出Excel,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 怎么在JavaWeb中导出Excel? 代码自解释 1,依赖包 ...

  5. JavaWeb中的Session、SessionListener、在线人数统计

    2019独角兽企业重金招聘Python工程师标准>>> JavaWeb中的Session 在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话. ...

  6. java 打开jsp文件_jsp文件怎么打开(java-web中jsp的理解)

    jsp文件怎么打开(java-web中jsp的理解)JSP:Java Server Pages.JSP是一种网页的编码格式,不同于HTML的是JSP中是由 HTML中的标签指令 和 Java逻辑代码 ...

  7. 在javaweb中通过servlet类和普通类读取资源文件

    javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在S ...

  8. java web.xml 监听器_十:JavaWeb中的监听器(一)

    2.1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域 ...

  9. 【Java】javaWeb中的三大组件与八大监听器

    一.三大组件 JavaWeb三大组件指的是:Servlet.Filter.Listener,这三个组件在JavaWeb开发中分别提供不同的功能,然而很多人可能只用过其中一个或者两个(Servlet.F ...

  10. javaWeb中 servlet 、request 、response

    1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个S ...

最新文章

  1. [android] androidPN开源项目介绍
  2. python学习方向-Python学习者的发展方向
  3. 使用objectdatasource结合数据绑定控件进行简单三层架构的开发
  4. 保护模式下寻址(易懂)
  5. 优酷 米兔机器人_小米(MI)米兔故事机智能故事机机器人智能机器人儿童早教机...
  6. WebAPI基本封装
  7. HDOJ1005(找循环节点)
  8. 离散数学 习题篇——生成主范式
  9. 第7集 驱动与电气原理图绘制
  10. matlab 中常用的日期格式转换
  11. 奇迹s6ep3服务器修改技术,奇迹S6EP3服务端之让天鹰及装备不掉持久的
  12. Windows 已经激活,但是显示副本不是正版的解决办法
  13. 2022教培机构升级转型新模式
  14. Java项目:SSM酒店客房管理系统
  15. mysql的填充因子_sql server填充因子
  16. mac下chrome插件安装位置
  17. 学神经网络应该看看哪些书,神经网络相关书籍
  18. 【Proteus仿真】数字温度计,利用 Mega16 控制 DS18B20 ,若温度达到设定阈值,即可报警提醒(用串口控制停止报警、用键盘输入改变报警阈值)
  19. 一些好的网页设计工具
  20. Java Graphics and 界面显示文字并换行

热门文章

  1. 提纲挈领webrtc音频处理算法之写在前面的话
  2. 【hihocoder 1554】最短的 Nore0061
  3. NextPermutation,寻找下一个全排列
  4. FOR XML PATH 应用及其反向分解
  5. 提高myEclipse的开发效率和外观,这些你都设置了吗?
  6. VM上安装Redhat无法选包
  7. 项目管理其实可以简单一点——项目风险
  8. Sams_Teach yourself XXX in XXX days
  9. 两种模式的资源管理器代码之———— 重命名文件夹
  10. MyBatis源码阅读(四) --- SqlSession的创建过程