servlet
Posted lldsgj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet相关的知识,希望对你有一定的参考价值。
1 Servlet执行过程
1.1 servlet简介
servlet: 用java语言开发网页动态资源的技术。
servlet特点:
1)servlet就是一个普通的java类,继承HttpServlet类
2)一个普通的java类实现了Servlet接口,也叫Servlet程序。我们通常继承HttpServlet是为了创建一个基于http协议的servlet程序。
3)servlet程序交给tomcat服务器运行!!!
1.2 Servlet开发过程
1)编写java类,继承HttpServlet
2)servlet程序交给tomcat服务器运行
A 把servlet的class字节码拷贝到WEB-INF/classes目录下
B 在web.xml文件中配置
1.3 Servlet的执行过程
前提: tomcat服务器启动时,会加载%conf%/web.xml文件。然后再加载站点下的每个web应用的web.xml文件。
浏览器输入: http://localhost:8080/day8/first
http:// http协议
1)本地hosts文件查询域名和ip的映射
2)找不到,联网到运营商的DNS服务器找域名和ip的映射
8080 端口 tomcat:8080
/day8 站点下的web应用名称
/first 资源名称。截取到/first 字符串
1)在day8应用下的web.xml文件中查找是否存在匹配的url-pattern
2)使用servlet的内部名称在web.xml文件中查找是否存在相同名称的servlet配置
3)得到对应的servlet-class内容。
通过反射构造FirstServlet对象,调用方法(doGet.......)
输出内容到浏览器,看到效果!!!
2 Servlet的路径映射
url-pattern: 表示servlet的路径映射,也叫servlet访问名称。
url-patttern 浏览器输入URL
精确匹配
/demo1 http://localhost:8080/day8/demo1
/test/demo1 http://localhost:8080/day8/test/demo1
模糊匹配
/* http://localhost:8080/day8/任意路径
/itcast/* http://localhost:8080/day8/test/任意路径
*.后缀 http://localhost:8080/day8/任意路径.后缀
(*.do *.action *.jsf *.html)
注意:
1)url-pattern要么以/开头,要么以*开头 例如: itcast/demo1错误写法。
2)不能同时使用两种模糊匹配。例如: /itcast/*.html 错误写法
3)当多个url-pattern同时符合匹配规则,那么
A 精确匹配的url-pattern会优先被执行。
B 后缀名结尾的模糊匹配的url-pattern优先级最低!!!
3 Sevlet缺省路径
/ : 表示servlet的缺省路径。
在tomcat服务器中配置了一个DefaultServlet,叫默认Servlet,该默认Servlet的url-pattern就是/ 。默认Servlet的作用,用于解析web应用下的静态资源。
问题: 浏览器输入一个资源名称时,查找资源的顺序是如何?
1)首先,在当前web应用下的web.xml文件中查找是否有匹配的url-pattern
2)如果匹配到,执行对应的servlet(动态资源)
3)如果没有匹配到,就交给tomcat服务器的默认Servlet去处理
4)默认Servlet会到当前web应用下读取对应名称的静态资源文件。
5)如果读到对应的静态资源文件,那么就把内容返回给浏览器
6)如果读不到对应的静态资源文件,那么就返回404的错误页面。
结论: 先找动态资源,再找静态资源!!!!
4 Servlet的生命周期(重点)
4.1 生命周期
以前:以前的程序,java类,自己去new对象,自己去使用对象调用。
现在: sevlet程序。servlet的生命周期由tomcat服务器控制的。
servlet什么时候对象创建,什么销毁,什么时候调用什么方法???
4.2 Servlet的四个生命周期
构造方法: 在创建servlet对象时调用。只调用1次。
证明servlet对象在tomcat服务器中是单实例的。
init方法:在创建完servlet对象后调用。只调用1次。
service方法: 在每次请求servlet时调用。调用n次。
destroy方法: servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用
4.3 Servlet自动加载
默认情况下,第一次访问servlet时创建servlet对象。创建对象的过程中会调用构造方法和inti方法。如果init方法的业务逻辑需要消耗比较长的时间,用户的第一次访问servlet时需要等待较长的时间。
改变servlet对象创建的时机: tomcat服务器启动的时候创建servlet对象。
<!-- 正整数:数值越大,创建对象的优先级越低 -->
<load-on-startup>1</load-on-startup>
5 Servlet线程安全问题
servlet对象特点: 在tomcat服务器中是单实例多线程的!!!
5.1 引发Servlet多线程问题
多个线程同时操作了Servlet的成员变量(共享数据)。
5.2 避免Servlet并发问题建议
1)尽量不要在servlet类中使用成员变量。
2)如果要使用成员变量,那么就要给使用到成员变量的代码块加上代码锁,尽量缩小同步锁的范围,以避免因为同步产生代码并发执行效率降低的问题。
6 Init方法问题
在GenericServlet中,有两个init方法。
有参数的init方法:该方法是servlet的四个生命周期方法中的一个。由tomcat服务器默认调用的初始化方法。在GenericServlet的实现中,该方法会调用无参数的init方法。
无参数的init方法:该方法的是Sun公司设计出来用于给开发者去覆盖,用于实现初始化逻辑的方法。
结论: 如果要编写servlet的初始化逻辑,只需要覆盖无参数的init方法即可!!!!
Servlet中重要对象:
1)HttpServletRequest对象:封装请求信息
2)HttpServletResponse对象:封装响应信息
3)ServletConfig对象: 封装一个servlet配置参数信息
4)ServletContext对象: 封装web应用环境信息
7 ServletConfig对象
7.1 ServletConfig创建
ServletConfig对象是在创建完servlet对象之后,被创建出来。然后通过有参数的init方法传递到servlet中。
ServetConfig对象主要用于加载servlet配置参数信息。
7.2 ServletConfig的API
getInitParameter(String name) --得到参数
getInitParameterNames()
ServletContext getServletContext() 得到servlet上下文对象
getServletName() 得到servlet名称
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class> ConfigDemo</servlet-class>
<!-- 配置servlet参数 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/bbs.txt</param-value>
</init-param>
<init-param>
<param-name>BBB</param-name>
<param-value>BBB‘s value</param-value>
</init-param>
</servlet>
注意: servlet的配置参数只对当前servlet有效的!!对其他servlet是无效的!!
8 ServletContext对象(重点)
8.1 ServletContext简介
ServletContext叫Servlet上下文对象,该对象表示当前的web应用环境信息。一个web应用只会创建一个ServletContext对象。
8.2 ServletContext创建时机
ServletContext对象是在tomcat服务器加载完当前web应用后创建出来。ServletContext对象是作为ServletConfig对象成员变量传入servlet中。通过ServletConfig的getServletContext()方法得到ServletContext对象。
8.3 ServletContext对象的API
得到web应用的上下文路径
getContextPath()
得到web应用的全局参数(所有servlet有效的!!)
getInitParameter(java.lang.String name)
getInitParameterNames()
域对象相关的方法(对比request域与context域)
setAttribute(String name, Object object)保存数据
getAttribute(String name) 得到数据
removeAttribute(String name) 清除数据
Request转发相关的
RequestDispatcher getRequestDispatcher(String path)
Response重定向
SendRedirect(string path)
web应用读取资源文件
getRealPath(String path)
"/WEB-INF/classes/news.properties"
getResourceAsStream(String path)
8.4得到web应用的上下文路径
getContextPath() 得到web应用上下路径。也就是部署到tomcat服务器上运行的web应用名称。
8.5得到web应用的全局参数
getInitParameter(String name)
getInitParameterNames()
<!-- 配置web应用全局的参数 -->
<context-param>
<param-name>AAA</param-name>
<param-value>AAA‘s value</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>BBB‘s value</param-value>
</context-param>
注意:
全局参数对当前web应用下的所有servlet都有效的!!!
8.6域对象相关的方法
ServetContext对象是一个域对象!!!
域对象的作用: 主要用于保存数据和获取数据,用于在web应用中不同资源之间共享数据。
Servlet1
response.sendRedirect(context.getContextPath+"/Servlet2?name=eric");
Servlet2
request.getParameter("name");
1)参数形式:只能传递字符串数据
2)使用域对象形式:
在Servlet1中保存数据
在Servlet2中获取数据
域对象相关的方法:
setAttribute(String name, Object object) 保存数据
getAttribute(String name) 得到数据
removeAttribute(String name) 清除数据
ServletContext域作用范围:
在当前的web应用中有效!!!
Servlet中所有域对象:
HttpServletRequest对象: request域
ServletContext对象: context域
HttpSession对象: session域
Jsp中域对象:
PageContext对象: page域
8.7转发相关的
getRequestDispatcher(String path)
在servlet中实现页面跳转
请求重定向: response.sendRedirect(路径);
请求转发: request.getRequestDispacher(路径).forward(request,respone);
=======请求重定向 vs 请求转发 区别====
请求重定向:
1)地址栏改变,改变为重定向到地址
2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。
3)处于两次不同的请求。不可以使用request域对象来共享数据。
请求转发:
1)地址栏不会改变。
2)只能转发到当前web应用内部资源。
3)处于同一次请求。可以使用request域对象来共享数据不同类型资源:
1)web应用内部资源。在当前web应用中的资源
2)其他web应用资源。在同一个站点下的其他web应用的资源。
3)站点外的资源。其他站点下的资源。
自定义servlet模板
https://www.cnblogs.com/ms-grf/p/7206196.html
package ${enclosing_package}; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns = { "/${primary_type_name}" }) public class ${primary_type_name} extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); response.getWriter().append("Served at: "); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
以上是关于servlet的主要内容,如果未能解决你的问题,请参考以下文章