Servlet
Servlet
* 做javaweb动态 Servlet/JSP
* Servlet简介
* 小的java的程序,运行在服务器端,接收和响应从客户端(浏览器)发送过来的请求。
* 编写Servlet程序(记事本和DOS下)
* 编写一个类实现Servlet接口,实现5个方法
* 继承GenericServlet类,重写一个方法。重写service方法
* 配置文件(在哪配置)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
* 带包编译
* javac -d . HelloServlet.java
* 设置临时环境变量(当成窗口有用)
* set classpath=%classpath%;xxx.jar
* 启动服务器,访问
* http://localhost:80/website/hello
Servlet的生命周期
* 生命周期:Servlet被创建,服务,销毁的过程。
* Servlet实例被创建后,调用init方法进行初始化
init(ServletConfig);
* service方法处理从客户端发送过来的请求
service(request,response);
* 销毁时调用destroy方法
destroy();
* 总结:只有第一次访问的时候,服务器创建Servlet的实例,调用init方法进行初始化操作。服务器创建两个对象,request和response,调用
的service进行处理,有一次请求,service就执行一次。服务器关闭或者移除项目,servlet实例就销毁,调用destroy方法进行销毁。
案例代码:
1 package itwsj;
2 import java.io.IOException;
3
4 import javax.servlet.Servlet;
5 import javax.servlet.ServletConfig;
6 import javax.servlet.ServletException;
7 import javax.servlet.ServletRequest;
8 import javax.servlet.ServletResponse;
9
10 /**
11 * Servelt
12 * @author Angus
13 *
14 */
15 public class ServletDemo implements Servlet{
16 /**
17 * Servlet被创建后,调用init方法进行初始化?
18 * * 什么时候被创建呢?
19 * * 第一次访问的时候创建的Servlet实例(服务器创建的)
20 * * init方法执行了几次呢?
21 * * 调用一次
22 */
23 @Override
24 public void init(ServletConfig config) throws ServletException {
25 // TODO Auto-generated method stub
26 System.out.println("init...");
27 }
28 /**
29 * service被调用了几次?
30 * * 有多少次请求,service执行几次
31 */
32 @Override
33 public void service(ServletRequest req, ServletResponse res)
34 throws ServletException, IOException {
35 // TODO Auto-generated method stub
36 System.out.println("service...");
37 }
38 @Override
39 public ServletConfig getServletConfig() {
40 // TODO Auto-generated method stub
41 return null;
42 }
43
44
45
46 @Override
47 public String getServletInfo() {
48 // TODO Auto-generated method stub
49 return null;
50 }
51 /**
52 * Servlet什么时候被销毁?
53 * * 服务器关闭,把应用移除
54 * destroy调用了几次?
55 * * 一次
56 */
57 @Override
58 public void destroy() {
59 // TODO Auto-generated method stub
60 System.out.println("destroy...");
61 }
62
63
64
65
66
67
68 }
运行截图:
第一次运行:
第二次运行:
第三次结束运行:
关系
Servlet 接口
|
GenericServlet(和协议无关)
|
HttpServlet (和HTTP协议相关)
|
HelloServlet
* 编写一个类,直接继承HttpServlet。
* 重写init,重写init()就ok。
* 初始化
* 重写doGet()或者doPost()
* 在web.xml中进行配置。
* 开发一个Servlet(最简单步骤)
* 编写一个类继承HttpServlet
* 重写两个doGet()和doPost(),互相调用。
* 在web.xml中编写配置文件
* 调用doGet方法,写自己的业务逻辑。
* 返回浏览器。
* 调用doPost方法,写自己的业务逻辑。
* 返回浏览器。
demo:
1 package cn.itcast.servlet;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletException;
6 import javax.servlet.http.HttpServlet;
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpServletResponse;
9
10 public class ServletDemo5 extends HttpServlet {
11
12 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
13 throws ServletException, IOException {
14 // xxx
15 }
16
17 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
18 throws ServletException, IOException {
19 doGet(req,resp);
20 }
21
22 }
修改模板
* 安装MyEclipse路径,找到com.genuitec.eclipse.wizards.xxx.jar
* myeclipse10.7\Common\plugins\com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar
* (千万别解压) -- 右键 -- 用解压工具打开 -- templates -- 修改模板
* 前提条件:先关闭MyEclipse。启动。
第一次访问(自动加载)
* init()
*
* 通过配置,配置启动加载,服务器一启动加载Servlet实例
* 在web.xml中,在<servlet>标签下
<load-on-startup>正整数</load-on-startup>
* 中间值越小,优先级越高。
访问路径的配置
<url-pattren>/demo</url-pattren>
* 访问:localhost/day07/demo
* 完全路径匹配
* 以/开头的, /demo
* 例子:<url-pattren>/servlet/demo</url-pattren>
* 访问:localhost/day07/servlet/demo
* 目录匹配
* 以/开头的 /*
* 扩展名匹配
* 不能以/开头 *.action *.do
* /servlet/*.do 启动服务器报错。
* 优先级:完全路径匹配 > 目录匹配 > 扩展名匹配(*****)
在web开发常见的路径的问题
* 相对路径
* 一个文件相对于另一个文件的位置的关系。
../demo ./demo demo
* 不能以/开头
* 例子: 访问demo8的Servlet:http://localhost/day07/demo8
访问demo1.html http://localhost/day07/demo1.html
* 从demo1.html中访问demo8的servlet
* 访问: ./demo8 demo8
* 访问html目录下demo2.html :http://localhost/day07/html/demo2.html
访问demo8的Servlet: http://localhost/day07/demo8
* 访问: ../demo8
* 绝对路径(推荐使用)
* 访问: http://localhost:80/day07/demo8
* 简写: /day07/demo8
* 以/开头的
* 客户端的绝对路径(编写项目名称)
* /day07/demo8
* 服务器的绝对路径(没有项目名称)
* /demo8
ServletConfig(跟配置文件相关)
* String getServletName() 获取配置文件中servlet的名称
* String getInitParameter(String name) 获取初始化参数
* Enumeration getInitParameterNames() 获取初始化的名称
* ServletContext getServletContext()
测试demo
1 package cn.itcast.demo;
2
3 import java.io.IOException;
4 import java.util.Enumeration;
5
6 import javax.servlet.ServletConfig;
7 import javax.servlet.ServletException;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12
13
14 /**
15 * 操作ServletConfig对象
16 * @author Angus
17 *
18 */
19 public class ConfigServlet1 extends HttpServlet {
20
21 public void doGet(HttpServletRequest request, HttpServletResponse response)
22 throws ServletException, IOException {
23
24 // 获取ServletConfig对象
25 ServletConfig config = this.getServletConfig();
26 // 获取servlet的名称
27 String name = config.getServletName();
28 System.out.println("servlet的名称:"+name);
29
30 String username = config.getInitParameter("username");
31 String password = config.getInitParameter("password");
32 System.out.println("用户名:"+username);
33 System.out.println("密码:"+password);
34
35 //
36 Enumeration<String> e = config.getInitParameterNames();
37 while(e.hasMoreElements()){
38 String name1 = e.nextElement();
39 String value = config.getInitParameter(name1);
40 System.out.println(name1+" : "+value);
41 }
42
43 }
44
45 public void doPost(HttpServletRequest request, HttpServletResponse response)
46 throws ServletException, IOException {
47 doGet(request, response);
48 }
49
50 }
运行结果就是配置文件的内容:
结果:
ServletContext域对象
* 获取全局初始化参数(配置)
* String getInitParameter(String name) 获取全局初始化参数
* Enumeration getInitParameterNames() 获取全局初始化参数的名称
* 实现数据的共享
* void setAttribute(String name, Object object) 设置属性
* Object getAttribute(String name) 获取
* void removeAttribute(String name) 删除
* 读取资源文件
* InputStream getResourceAsStream(String path) 通过文件的地址获取输入流
* String getRealPath(String path) 通过文件的地址获取文件的绝对磁盘路径
初始化参数demo
1 package cn.itcast.demo;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletContext;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 /**
12 * 操作servletContext对象
13 * @author Angus
14 *
15 */
16 public class ContextDemo1 extends HttpServlet {
17
18 public void doGet(HttpServletRequest request, HttpServletResponse response)
19 throws ServletException, IOException {
20
21 // 获取servletContext对象
22 ServletContext context = this.getServletContext();
23 String encoding = context.getInitParameter("encoding");
24 System.out.println("编码:"+encoding);
25
26 }
27
28 public void doPost(HttpServletRequest request, HttpServletResponse response)
29 throws ServletException, IOException {
30 doGet(request, response);
31 }
32
33 }
配置文件:
1 <!-- 配置全局初始化参数 -->
2 <context-param>
3 <param-name>encoding</param-name>
4 <param-value>UTF-8</param-value>
5 </context-param>
共享demo:
1 package cn.itcast.demo;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletContext;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 /**
12 * 记录网站访问的次数
13 * @author Angus
14 *
15 */
16 public class ContextDemo2 extends HttpServlet {
17
18
19 public void init() throws ServletException {
20 this.getServletContext().setAttribute("count", 0);
21 }
22
23 public void doGet(HttpServletRequest request, HttpServletResponse response)
24 throws ServletException, IOException {
25 ServletContext context = this.getServletContext();
26 Integer count = (Integer) context.getAttribute("count");
27 context.setAttribute("count", ++count);
28
29 response.setContentType("text/html;charset=UTF-8");
30 response.getWriter().write("<h1>大爷,下次再来哦!!</h1>"+"亲,网站被访问了"+count+"次");
31
32
33
34 }
35
36 public void doPost(HttpServletRequest request, HttpServletResponse response)
37 throws ServletException, IOException {
38 doGet(request, response);
39 }
40
41 }
效果:
读取资源文件demo
1 package cn.itcast.demo;
2
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.util.Properties;
8
9 import javax.servlet.ServletContext;
10 import javax.servlet.ServletException;
11 import javax.servlet.http.HttpServlet;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14
15 /**
16 * 读取资源的文件
17 * @author Angus
18 *
19 */
20 public class ReadServlet extends HttpServlet {
21
22 public void doGet(HttpServletRequest request, HttpServletResponse response)
23 throws ServletException, IOException {
24 run5();
25 }
26
27 public void doPost(HttpServletRequest request, HttpServletResponse response)
28 throws ServletException, IOException {
29 doGet(request, response);
30 }
31
32
33 /**
34 * 通过文件的绝对磁盘路径读取资源文件
35 * @throws IOException
36 */
37 public void run5() throws IOException{
38 ServletContext context = getServletContext();
39 String path = context.getRealPath("/WEB-INF/classes/db.properties");
40 // C:\apache-tomcat-6.0.14\webapps\day07\WEB-INF\classes\db.properties
41 System.out.println(path);
42 InputStream in = new FileInputStream(path);
43 Properties pro = new Properties();
44 pro.load(in);
45 String username = pro.getProperty("username");
46 String password = pro.getProperty("password");
47 String desc = pro.getProperty("desc");
48 System.out.println("用户名:"+username);
49 System.out.println("密码:"+password);
50 System.out.println("描述“:"+desc);
51 }
52
53
54 /**
55 * 使用ServletContext读取WebRoot目录下的资源文件
56 * @throws IOException
57 */
58 public void run4() throws IOException{
59 ServletContext context = getServletContext();
60 InputStream in = context.getResourceAsStream("/db.properties");
61 Properties pro = new Properties();
62 pro.load(in);
63 String username = pro.getProperty("username");
64 String password = pro.getProperty("password");
65 String desc = pro.getProperty("desc");
66 System.out.println("用户名:"+username);
67 System.out.println("密码:"+password);
68 System.out.println("描述“:"+desc);
69 }
70
71 /**
72 * 使用ServletContext读取包下的资源文件
73 * @throws IOException
74 */
75 public void run3() throws IOException{
76 ServletContext context = getServletContext();
77 InputStream in = context.getResourceAsStream("/WEB-INF/classes/cn/itcast/demo/db.properties");
78
79 Properties pro = new Properties();
80 pro.load(in);
81
82 String username = pro.getProperty("username");
83 String password = pro.getProperty("password");
84 String desc = pro.getProperty("desc");
85
86 System.out.println("用户名:"+username);
87 System.out.println("密码:"+password);
88 System.out.println("描述“:"+desc);
89 }
90
91 /**
92 * 使用ServletContext读取src下的资源文件
93 * @throws IOException
94 */
95 public void run2() throws IOException{
96 ServletContext context = getServletContext();
97 InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties");
98
99 Properties pro = new Properties();
100 pro.load(in);
101
102 String username = pro.getProperty("username");
103 String password = pro.getProperty("password");
104 String desc = pro.getProperty("desc");
105
106 System.out.println("用户名:"+username);
107 System.out.println("密码:"+password);
108 System.out.println("描述“:"+desc);
109 }
110
111 /**
112 * 读取资源文件
113 * @throws IOException
114 */
115 public void run1() throws IOException{
116 InputStream in = new FileInputStream("src/db.properties");
117 Properties pro = new Properties();
118 pro.load(in);
119
120 String username = pro.getProperty("username");
121 String password = pro.getProperty("password");
122 String desc = pro.getProperty("desc");
123
124 System.out.println("用户名:"+username);
125 System.out.println("密码:"+password);
126 System.out.println("描述“:"+desc);
127 }
128
129 }
130
131
132
133
134
缺省的servlet
* tomat/conf/web.xml中配置 可以配置404等返回码一些情况
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value> true可以跟进代码目录
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>