Servlet工作原理
- 客户端发送请求至服务器
- 服务器将请求信息发送至servlet
- Servlet生成相应内容并传给服务器,响应内容动态生成,取决于客户端的请求
- 服务器将响应返回给客户端
生命周期
Servlet的生命周期通过java.servlet.Servlet接口中的init()、service()、和destroy()方法表示。Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。
编写一个Servlet
首先new一个class
public class HelloServlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) {
try {
response.getWriter().println("<h1>Hello Servlet!</h1>");
response.getWriter().println(new Date().toLocaleString());
}catch(Exception e){
e.printStackTrace();
}
}
}
(此处的doGet方法源自于Servlet接口下的唯一服务方法service,分为doGet方法和doPost方法。
doGet方法不可用于提交二进制文件,比如上传文件,同时大小只有1024字节。因为是参数传递,且会在地址栏中显示,所以安全性差,会直接显示用户信息。
doPost方法必须在配置中通过<action=“login” form method=“post”>来指定,否则默认为doGet,post方式提交数据时采用HTTP的post机制,将表单中的字段和值放在HTTP HEADER内一起传送到action所指的url中,用户不可见,所以是安全的)
然后在WEB-CONTENT/WEB-INF下创建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello.html</url-pattern>
</servlet-mapping>
</web-app>
注:url-pattern拥有自己的匹配规则
大致分为:精准匹配,路径匹配,拓展名匹配和缺省匹配
优先级从前往后
精准匹配如代码所示,单斜杠/,且url完全匹配。
路径匹配格式为/hello/ 会匹配hello路径下所有的url
拓展名匹配格式为.action 会匹配拓展名为.action的url
以上都不符合 则缺省匹配*
最后配置tomcat访问路径,启动
细节:
加载:servlet实例的创建和init方法的调用是在第一次请求时,而非服务器启动时,除非在servlet标签配置load-on-start-up,数字越小优先级越高。
请求:服务器针对客户端的每一次请求都会创建新的request和response对象(它们的生命周期很短),传给service方法。
掌握response和request对象也很重要
详见https://blog.csdn.net/a859522265/article/details/7259115
ServletContext
概念
一个web应用所有servlet共享同一个ServletContext对象,可实现数据共享。ServletContext被称为context域对象。
域:作用范围;context域:整个应用程序范围。
ServletContext域:
这是一个容器
说明了这个容器的作用范围,也就是应用程序范围
转发:客户机一次请求;重定向:客户机两次请求
作用
获取web应用的初始化参数
实现servlet转发
利用ServletContext对象读取资源文件
获得文件路径
读取资源文件的三种方式
.properties文件(属性文件)
配置文件:properties文件和xml文件;数据有关系使用xml文件,没有关系则使用properties文件。
1.通过ServletContext的getResourceAsStream方法,读取properties文件
模板代码(注意文件位置不同写路径会不同):
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/org/iot/servlet/db.properties");
Properties properties = new Properties();//map
properties.load(in);
2.通过servletContext的getRealPath方法得到资源的绝对路径,再通过传统方式(FileInputStream)读取
3.通过类装载器去读,ClassLoader的getResourceAsStream(如果读取资源文件的程序不是servlet),文件不能太大。只装载一次,所以如要读到更新后的数据,通过类装载的方式得到资源文件的位置,再通过传统方式读取资源文件的数据(用getResource得到path,再用FileInputStream)
而JSP则是serlvet的拓展,从编写角度来说,可以理解将servlet看做含有HTML的java程序,而JSP则是含有java代码的HTML页面。明日附上JSP原理和用法笔记~~