Servlet概述
- 定义:Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序,其主要功能在于交互式浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
- Servlet是JavaWeb的核心程序,是JavaWeb三大组件之一。
- 在HTTP请求过程中会把请求的参数存放在请求行的ULR中,或者是请求体中,这个参数需要服务器来接受解析并处理,Servlet就是用来处理这个过程的
- Servlet的作用:
- 用来处理客户端发送过来的请求,并对该请求做出响应。
- 获取接收客户端发送来的请求数据
- 处理请求
- 将处理的结果通过响应发送到客户端。
5.Servlet的版本:
- 异步处理支持:有了该特性,Servlet线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程。在接收到请求之后,Servlet线程可以将耗时的操作委派给另一个线程完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
- 新增的注解支持:该版本新增了若干注解,用于简化Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得web.xml部署描述文件从该版本开始不再是必选的了
- 可查性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括Spring在内的各种常用框架的整合特性记忆犹新。将相应的插件封装JAR包并放在类路径下,Struts2运行时便能自动加载这些插件。现在Servlet3.0提供了类似的特性,开发者可以通过插件的方式很方便的扩充了已有的Web应用的功能,而不需要修改原有的应用
编写第一个Servlet
- 通常是继承javax.servlet.http.HttpServlet
- 复写doGET(),doPost()方法
- 配置web.xml文件:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>net.zixue.servlet.HelloServlet</servler-class>
<servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet<url-pattern>
<servlet-mapping>
其中<servlet>用来注册Servlet的
内部的<servlet-name>是servlet的名称,在当前配置文件中必须唯一
内部的 <servlet-class>是servlet实现类的类名,类名要包含包名
IDEA在Servlet3.0版本下创建Servlet
- 创建项目的时候javaEE版本选择6.0以上
- 在IDEA的代码目录下直接右键new,选择Servlet
- 配置@WebServlet(urlPatterns="/TestServlet"),注解内的访问路径等同于web.xml下的url-parrtener
HttpServletRequest请求对象
1. HttpServletRequest简介: 在Servlet的API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用于封装HTTP请求,由于HTTP请求包含着请求行,请求头和请求体三部分,因此在HttpServletRequest中分别定义了接收请求行,请求头和请求体的相关方法
2.获取请求行相关信息和相关方法
1.getMethod()方法,返回请求方法,请求方法通常是GET或者POST,但也有可能HEAD,PUT或者DELETE
2.getRequest()方法,返回URI(URI是URL的从主机和端口之后到表单数据之前的那一部分)
3.getRemoteAddr()方法,该方法用于获取请求客户端的IP地址
4.getRemoteport()方法,该方法用于获取请求客户端的端口号
5.getLocalAddr()方法,该方法用于获取服务器当前接收请求的IP地址
6.getContextPath()方法,该方法用于获取URL中属于web应用程序的路径
7.getProtocol()方法,该方法用于获取请求行中的协议名和版本
3. 获取请求头的相关方法
1.getHeader(String name), 该方法用于获取一个指定头字段的值,如果请求头中不包含该字段则返回null,如果包含多个字段的值则获取第一个值
2.getIntHeader(String name), 该方法用于获取指定头字段的值,并且将其值转为int类型,如果不存在该字段则返回-1,如果获取到的值不能转换为int,则会发生NumberFormatException异常
3.getDateHeaders(String name), 该方法用于获取指定头字段的值,并将其按照GMT时间格式转换成一个代表日期/时间的长整数
4.getHeaderNames(), 该方法用于获取所有包含请求头字段的Enumeration
4.HttpServletRequest获取请求参数
获取请求参数: 1.getParameter(String name), 用于获取某个指定名称的参数值,如果请求中没有包含指定名称的参数,则返回null,如果有指定参数但是没有给设置值,则返回空串"",如果包含多个该参数的值则返回第一个出现的参数值
2.getParameterNames(), 该方法用于返回一个包含请求消息中所有参数名的Enemernation
3.getParaneterMap(), 该方法用于将请求中所有参数和值装入一个map对象然后返回
HttpServletResponse响应对象
发送响应行:
1.setStatus(int status): 当Servlet向客户端回送响应消息时,需要设置一个状态码,该方法用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中状态的描述直接和状态码相关,而HTTP协议版本有服务器决定,因此只需要设置该方法,就可以发送一个响应行,正常情况下,web服务器会默认发送一个200的状态码
2.sendError(int code): 该方法用于发送表示错误信息的状态码,例如404找不到访问的资源,它还有一种重载的形式sendError(int code,String errorMessage),errorMessage可以以文本形式显示在客户端浏览器
发送响应头:
1. addHeader (String name, String value):该方法用来設置HTTP协议的响应头字段,其中name是响应头字段名, value是响应头字段的值
2.setHeader (String name, String value): 该方法和addHeader相同,唯一的区別是addHeader可以重复添加一个同名的响应头字段,setHeader会覆盖之前添加的同名的响应头
3.addIntHeader(String name, int value), set IntHeader (String name, int value) : 这两个方法用于将value值为int的字段加入到响应头中
4.setContentLength(): 该方法用于设置HTTP响应消息的内容大小,単位是字节
5.setContentType(): 该方法用于没置Servlet输出内容的类型,也就是HTTP中的Content-Type响应头。例如发送到客户端的内容是jpeg格式的图像数据,就需响应头字段的类型设置为"image/jpeg" ,另外.如果相应的内容是文本,那这个吋候setContentType还可以设置字符编码,例如setContentType还可以设置字符编码,例如text/html:charset=UTF-8
6.setCharacterEncoding(String charset)
HttpServletResponse-发送请求体
背景知识: 由于在HTTP响应消息中,大量的数据都是通过响应体传递的,因此ServletRespone遵循以IO流传递大数据的设置理念,定义了两个与输出流相关的方法,具体如下:
1.getOutputStream()方法: 该方法获取的字节流输出对象为ServletOutputStream类型,它是OutputStream的子类,因此可以直接输出字节数组中的二进制数据
2.getWrite()方法: 该方法获得的字符输出流对象是PrintWrite类型,由于它可以直接输出文本类型,因此要输出网页文档,需要使用这个方法
4.8验证码切换
案例: 实现网站登陆中验证码的切换功能
背景知识: 用户在注册或者登录过程中经常会遇到必须输入验证码的情况,那这个验证码主要是为了防止恶意程序访问服务器而设置的
实现原理: 浏览器显示文档和图片,是由服务器回送给浏览器的响应完成的,而一个响应要封装成一个HttpServletResponse对象,所以我们只要将验证码的图片封装到HttpServletResponse对象返回给浏览器即可
Servlet的生命周期
定义: 生命周期: 就是一个对象从创建到销毁的过程
Servlet的生命周期: Servlet从创建到销毁的过程
Servlet接口以及相关方法
1.Servlet接口: javax,servlet.Servlet接口 int(ServletConfig)方法,初始化方法 servlet(ServletRequest,ServletResponse)方法,每次访问都会调用来处理请求 destory()方法,销毁servlet方法
2.HttpServlet接口: javax.servlet.http 继承自Servlet接口,并重新实现了service方法,根据不同请求方式调用不同的处理方法 service(HttpServletRequest,HttpServletResponse)方法,获取请求方式,分别调用doGet(),或者doPost()方法
Servlet生命周期整个过程描述
当服务器关闭或者项目被移除服务器,destory方法会执行,生命周期结束
Servlet接口下的service方法并不会调用doGet或者doPost处理请求而HttpServlet下的service方法会调用doGet或者doPost方法处理请求
注意: Servlet势实例是单例的,即无论请求多少次Servlet,最多只有一个Servlet实例,如果是多个客户端并发,同时访问Servlet的时候,服务器会启动多个线程分别执行Servlet的service方法
原因: 如果我们每次访问都创建一个Servlet实例,会占用和浪费过多的计算机资源
ServletConfig对象
定义: ServletConfig对象是它所对应的Servlet对象的相关配置信息
特点: 每一个servlet对象都有一个ServletConfig对象和它相对应
ServletConfig对象在多个Servlet对象之间是不能共享的
作用:常见的ServletConfig对象的方法: 1.getInitParameter(String name) 返回一个初始化变量的值
2.getInitParameterName() 返回servlet初始化参数的所有名称
3.getServletContext() 获取ServletContext对象
4.getServletName() 获取Servlet的name配置值
ServletContext对象
ServletContext定义: 即Servlet上下文对象,该对象表示当前web应用环境信息
获取ServletContext对象: 1.通过ServletConfig的getServletCintext()方法可以得到ServletContext对象
2.HttpServlet中直接通过this.getServletContext()获取
域对象: (域对象就是在不同资源之前来共享数据,保存数据,获取数据)ServletContext对象通常称为Context域对象。
应用:使用ServletContext获取整个Web项目初始化参数
在web.xml中配置初始化参数:<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
String getInitParameter (String name); 根据名称获取初始化参数
Enumeration getInitparameterNames(); 获取随意初始化参数名称
使用ServletContext在多个Servlet中共享数据
void setAttribute(String name,Object object); 存放数据
Object getAttribute(String name); 获取数据
void removeAttribute(String name); 删除数据
Servlet之间的跳转
Servlet之间可以实现跳转,从一个Servlet跳转到另一个Servlet,利用Servlet的跳转技术可以很方便的把一块业务模块分开,比如使用一个Servlet接收用户提交数据,使用另一个Servlet读取数据库,最后跳转到另一个Servlet把处理结果展示出来,这也就是MVC模式。
MVC: 用一种业务逻辑,数据,界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入,处理和输出功能在一个逻辑的图形化用户界面的结构中。
转发Forward简介: 在Servlet中如果当前的web资源不想处理请求时,可以通过forward方法将当前请求传递给其他Web资源处理,这种方式称为请求转发。
登录错误时显示错误界面
请求转发的相关方法: RequestDispatcher对象,可以通过request.getRequestDispatcher()方法获取调用这个对象的forward方法就可以实现请求转发
转发过程中携带数据: request本身也是一个域对象,request可以携带数据传递给其他web资源
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeName方法
通过request对象的setAttribute方法
重定向介绍
1.简介: 重定向是根据服务器返回等我状态码来实现的。客户端浏览器在请求服务器大的时候,服务端会返回一个状态码。服务器通过HttpServletResponse的setStatus(int status)方法来设置状态。如果服务器这个时候返回状态码是301或者是302,则浏览器就会到新的网址重新请求该资源。服务器的响应中会带着这个新资源的地址
2.请求重定向相关代码: //设置状态码为302,SC_MOVED_TEMPORAILY就是302的静态常量
response.setStatus(HttpServletResponse.SC_MOVED_TOMPORAILY);
//在请求头中携带新的资源地址
response.setHeader("Location","http://www.baidu.com");
为了方便HttpServletResponse中将setStstus和setHeader这两种方法合并到一起叫做sendRedirect(String location);
请求转发和重定向的区别
1.重定向的地址栏会发生变化,转发不会
2.重定向是两次请求两次响应,转发是一次请求一次响应
3.重定向路径需要加工程名,转发路径不需要加工程名
4. 重定向可以跳转到任何网站,转发只能在服务器内部进行
Servlet线程安全
定义:当多个客户端并发访问一个Servlet的时候,web服务器会为每一个客户端的访问创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内部如果访问了同一个资源的话,就可能引发线程安全问题
如何解决Servlet线程安全
1.同步代码块 2.实现SingleThreadModle接口3.尽量不要在Servlet实例内使用共享变量