Servlet学习笔记
一、Servlet的概念
(1)概念
Servlet是服务器端的Java应用程序,使用Servlet可以处理各种客户端的请求,完成业务处理,动态生成HTML页面。
在Java EE的 Web 应用程序开发技术中,Servlet是最基础也是最核心的技术
每一个Servlet其实就是一个实现了特定接口的java类,该类被编译后放置在web应用程序的特定目录下,当某个匹配的请求到来时,Servlet容器会自动实例化该类并调用其内部的方法。
我们所开发的Servlet类由Web服务器根据客户端的请求自动加载和执行。通常把Web服务器中的Servlet运行环境称为Servlet容器。
(2)运行机制
(3)javax.servlet.Servlet接口
该接口定义了Servlet对象的生命周期方法:
void init(ServletConfit config) //在Servlet被实例化后被执行一次
void service(ServletRequest req, ServletResponse resp) //处理请求
void destroy() // Servlet实例卸载前被执行一次
(4)请求对象和应答对象
当Servlet容器调用Servlet实例中的方法时,会将客户端提交来的请求参数以及其它信息,封装到一个 HttpServletRequest对象中供Servlet使用。
同时, Servlet容器也会提供一个HttpServletResponse对象,开发者借助此对象给客户端返回应答内容。
(5)javax.servlet.Servlet接口的实现类:
GenericServlet抽象类实现了Servlet接口,该类提供了Servlet接口中除了service()方法之外其它方法的实 现。
HttpServlet类继承自GenericServlet,并根据HTTP协议实现了Servlet接口中的方法。
(6)HttpServlet提供了两个重要的方法供子类重写,
分别是:
void doGet(HttpServletRequest req, HttpServletResponse resp)
void doPost(HttpServletRequest req, HttpServletResponse resp)
如果要处理get请求,就重写doGet方法,
如果要处理post请求,就重写doPost方法。
二、使用servlet
1、开发步骤:
(1)自定义类,继承自HttpServlet
(2)重写类中的doGet或doPost方法
处理请求并返回应答。应答主要包含:
○设置应答内容的MIME类型。
MIME (Multipurpose Internet Mail Extensions)
○借助流对象输出HTML页面的内容
(3)在web.xml文件中配置Servlet
2、Servlet配置说明:
<servlet>元素用来配置Servlet实例名和类的对应关系;
<servlet-mapping>元素用来配置Servlet实例和URL的映射关系。
额外的配置
<servlet>元素下可包含另两个子元素:
<init-param>用来配置初始参数,在Servlet中可使用以下方法得到该参数: super.getInitParameter(“para_name”);
<load-on-startup>用来配置Servlet的加载时机,如果取值为1,则在Tomcat启动时就实例化该Servlet。否则,在接收到请求时实例化该Servlet。
<servlet-mapping>元素下可包含多个<url-pattern>子元素。
3、Servlet的生命周期
Servlet对象的生命周期由Servlet容器来维护。
服务器在启动时或接收到针对某个Servlet的请求时,会实例化该Servlet类。该类的实例只有一个,即使用一个Servlet对象处理所有的请求。
Servlet对象中的生命周期方法:
init() – 仅在Servlet被实例化时被执行一次。
service() – 对于客户端的每个请求,Servlet容器将在一个单独的线程中调用此方法。HttpServlet类中的service()方法的默认行为是转发http请求到doXXX方法。 因此,子类不要重写这个方法!
子类应重写doGet()和 doPost()进行业务逻辑处理。
destroy() – 服务器卸载Servlet实例时该方法被执行。
4、HttpServletRequest类
客户端发送的请求被封装成一个HttpServletRequest对象。该对象中包含了客户端请求的URL、提交的参数等信息,另外还包含了客户端的IP地址以及所使用的操作系统等信息。
HttpServletRequest类中的方法:
String getParameter(String paraName ) //返回某个请求参数的值,无论参数以Query String还是表单数据。
String[] getParameterValues( String paraName) //返回某个请求参数的值的数组
若参数有多个值,前一个方法仅能返回第1个值;若参数只有一个值,后一个方法返回长度为1 的数组。
续: HttpServletRequest类中的方法
getLocale() //获取客户端的语言环境
getQueryString() //获取查询字符串,即URL中?后面的字符串
getRemoteAddr() //获取客户端的IP地址
getRequestURL() //获取请求的URL
getContextPath() //获取应用的上下文路径。类似于:/appname
getHeader() //获取请求头中的对应值
请求转发:
request.getRequestDispatcher("/2.jsp").forward(req, resp);
五、HttpServletResponse类
在Servlet中, 使用HttpServletResponse对象给客户端返回数据。
HttpServletResponse类中的方法:
getWriter() 返回 PrintWriter流对象,可以将文本内容返回给客户端
getOutputStream() 获取字节输出流
sendRedirect() 重定向到其他资源
请求重定向
response.sendRedirect("/webapp/target.jsp");
参数path给出目标页面或目标Servlet的请求路径。路径前面要加web应用程序的名称。
转发(forward)和重定向(redirect)区别:
转发是在服务器端的跳转,客户端并不知道这个跳转过程。
重定向则是给客户端返回一个302应答以及新的URL路径,浏览器使用新的URL发送第二次请求。
转发目标只能本应用程序内部;重定向则随意。
六、Servlet中的异常处理
对于程序中的Checked异常,应该使用try catch结构进行捕获处理;
对于RuntimeException ,如果没有捕获,默认情况下会在客户端浏览器中显示500错误。为了给用户一个友好的提示,应该在web.xml文件中进行配置:
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
error-code是错误代码,location是转向页面。常见的错误代码:400,403,404,500等。
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
exception-type 是错误类型。
七、Cookie和Session
Cookie
Cookie是服务器存放在客户端的一段文本。不同的服务器均可在客户端存放特定于本服务器的多个Cookie。
当客户端发来请求时,服务器可在应答数据中包含多个Cookie,这些文本信息会被浏览器保存起来。当浏览器再次向该服务器发起请求时,会自动将Cookie内容发回给服务器。
借助Cookie,服务器端可以对用户进行身份验证,会话跟踪等。
每个Cookie中通常包含网站的域名、文本内容、有效期等信息。浏览器通常会对Cookie内容进行加密存放,并且会确保Cookie仅被发送给正确的服务器。
Session
Session是在服务器端记录用户信息的一种机制。
当用户第一次访问Servlet或jsp页面时,服务器为此用户创建一个session 对象,并生成一个唯一的编号(session id),这个编号和session 对象一对一关联;然后将这个编号作为Cookie发送给客户端。(JSESSIONID、maxAge=-1)
客户端发起后续的请求时,浏览器默认会将Cookie发回给服务器,服务器通过这个编号就可以获取到关联的Session对象。这样,就可以在多个Servlet之间共享数据了。
当客户端浏览器关闭后,Cookie失效。当用户重新访问此Servlet或jsp页面时,因为没有提交之前的Cookie,将被视为新的用户。
通常称session对象中数据的生存期为session范围。
通过调用request.getSession()方法即可获得当前用户对应的session对象。
session对象的使用:
(1) setAttribute(String attName , Object attValue):设置session范围内attName属性及其值attValue。
(2) getAttribute(String attName):返回session范围内attName属性的值。
(3) removeAttribute(String name):从session中删除该属性
(4) invalidate():销毁这个session对象
session对象中有一个属性:lastAccessedTime。每一次用户请求到达,服务器都会刷新该属性。
当超过一定时间(默认30分钟)用户没有发起请求,服务器会自动删除该session对象。
session对象的失效时间可以在web.xml中进行配置:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
客户端也可以主动发起一次请求,调用session对象的invalidate()方法让其失效。
八、servlet 过滤器
过滤器不是Servlet,它主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理。
在Servlet被调用之前修改Request对象;
在Servlet被调用之后修改Response对象。
在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置创建每个 Filter 实例;然后根据配置对匹配的请求进行过滤。
web.xml文件中可以配置多个过滤器,它们形成了过滤器链(filter chain)。
多个过滤器的执行顺序与web.xml文件中的配置顺序一致。
用户端的请求将经过过滤器链中的所有过滤器之后才能到达Servlet,同时,服务器端的响应也要经过过滤器链中的所有过滤器后才会被发送给客户端。
过滤器可以过滤的Web组件包括Servlet,JSP和HTML文件等。
使用过滤器的步骤
1、自定义过滤器类,实现javax.servlet.Filter接口。
public void init(FilterConfig filterConfig)
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
public void destroy()
2、在web.xml中配置过滤器
过滤器的应用
(1) 统一设置请求和应答的字符编码
(2) 记录日志和操作耗时:记录用户的IP信息以及某个方法的耗时。
(3) 用户权限验证:限制某些servlet或jsp页面只允许已登录用户或者具有权限的用户才能访问。
九、servlet监听器
实现了ServletContextListener接口的类实例能够监听ServletContext对象的生命周期,也就是监听Web应用程序的生命周期。
以便在web应用启动时做某些初始化工作,在web应用卸载时做一些清理性工作。
比如:解析自定义的配置文件获取配置信息,释放数据库连接池的工作等。
ServletContextListener接口中定义了两个方法:
contextInitialized(ServletContextEvent sce) //Servlet容器启动Web应用时调用该方法。在调用完该方法后才初始化过滤器,然后才初始化Servlet实例。
contextDestroyed(ServletContextEvent sce) //当Servlet容器终止Web应用时调用该方法。在调用该方法之前所有的Servlet和过滤器已被销毁。
附:Servlet 3.0规范
@WebServlet注解用来部署Servlet组件。可使用的属性:
loadOnStartup : 加载顺序
initParams: Servlet的init参数。
name: Servlet的名称。对应于 <servlet-name>
urlPatterns: 访问Servlet的URL。对应于<url-pattern>
value: 访问Servlet的URL。
注:vlaue 和 urlPatterns 是必需的,但二者不能共存,如果同时指定,通常忽略 value 的取值。
【示例】
@WebServlet(urlPatterns = "/userServlet/login", name = "userServlet")
@WebServlet(name=“userServlet",urlPatterns={"/userServlet","/testServlet"})
// 多个urlPattern使用{}括起来。
【示例】设置初始化参数
@WebServlet(name = "userServlet", urlPatterns = { "/userServlet" }, loadOnStartup = 1, initParams = { @WebInitParam(name = "encoding", value = "utf-8") })
@WebFilter用来配置过滤器。
常用属性:
filterName 过滤器名称,等价于 <filter-name>
value 该属性等价于 urlPatterns 属性。但两者不应该同时使用。
urlPatterns 指定过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。
servletNames 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值。
【示例】
@WebFilter(filterName = "charFilter", urlPatterns = { "/*" })