Servlet
servlet API概述
该API中一共包括四个包:
javax.servlet、javax.http、javax.servlet.annotation、javax.servlet.descriptor
用户的请求会引发servlet容器调用一个servlet的service方法,并给这个方法传入一个servletRequest实例和servletResponse实例,request封装http请求,response封装http响应
servlet容器会为每一个应用创建一个servletContext实例,这个对象用于封装应用程序的环境(配置文件什么的)
同时,servlet容器会为每个servlet创建一个ServletConfig实例,该实例封装的是servlet的配置信息
注意区分ServletContext和ServletConfig,一个是应用程序,一个是servlet,前者的作用范围明显要大于后者
servlet有以下五个主要方法
生命周期方法有三个:
init(servletconfig config)
service
destory
另外两个为:
getServletInfo
返回该servlet的描述
getServletConfig
返回由servlet容器传递给init方法的servletconfig对象
线程安全:
一个应用程序中的所有用户共享一个servlet实例,因此不建议使用类级变量(就是全局变量,static修饰的那种)
编写servlet应用
需要注意的一点是:xml文件并不是必须的,可以使用@WebServlet的形式代替web.xml,如下所示,不过要知道的是,在tomcat7才有javax.servlet.annotation这个API
package app01a;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "ServletConfigDemoServlet",
urlPatterns = { "/servletConfigDemo" },
initParams = {
@WebInitParam(name="admin", value="Harry Taciak"),
@WebInitParam(name="email", value="admin@example.com")
}
)
public class ServletConfigDemoServlet implements Servlet {
private transient ServletConfig servletConfig;
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void init(ServletConfig servletConfig)
throws ServletException {
this.servletConfig = servletConfig;
}
@Override
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
String admin = servletConfig.getInitParameter("admin");
String email = servletConfig.getInitParameter("email");
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.print("<html><head></head><body>" +
"Admin:" + admin +
"<br/>Email:" + email +
"</body></html>");
}
@Override
public String getServletInfo() {
return "ServletConfig demo";
}
@Override
public void destroy() {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
这样也是可以正常运行的:
稍微解释以下@WebServlet的用法
name = "ServletConfigDemoServlet",
urlPatterns = { "/servletConfigDemo" },
1
2
声明了当url为/servletConfigDemo时,应该调用这个servlet,这个其实和xml形式的声明是差不多的
<servlet>
<servlet-name>Ch3 Beer</servlet-name>
<servlet-class>
com.example.web.BeerSelect
</servlet-class>
<servlet-mapping>
<servlet-name>Ch3 Beer</servlet-name>
<url-pattern>/SelectBeer.do</url-pattern>
</servlet-mapping>
</servlet>
1
2
3
4
5
6
7
8
9
10
11
这个xml意思是当url为/SelectBeer.do时,调用com.example.web.BeerSelect
可以看到,使用注解的方式更加地简洁
上面有一个关键字transient,这里有必要稍微解释一下:
https://blog.csdn.net/include_heqile/article/details/90453547
保存在servletContext中的对象称为属性,servletContext提供了下面四个方法来用于处理属性:
getAttribute
getAttributeNames
setAttribute
removeAttribute
servletContext的作用域比较大,我们可以使用该对象的这一特性,来在web应用的不同servlet中共享信息
在上面我们编写的类是直接继承的Servlet,但是这样做我们需要实他的5个方法,而且还有维护一个servletConfig对象,这样会显得很麻烦,还好我们有GenericServlet,GenericServlet是一个抽象类,它实现了Servlet和ServletConfig,并对Servlet接口中的所有方法提供了默认实现,并提供了用来包装ServletConfig的方法
package app01a;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;package app01a;
import java.io.IOException;
@WebServlet(name = "GenericServletDemoServlet",
urlPatterns = { "/generic" },
initParams = {
@WebInitParam(name="admin", value="Harry Taciak"),
@WebInitParam(name="email", value="admin@example.com")
}
)
public class ServletConfigDemoServlet extends GenericServlet {
private static final long serialVersionUID = 62500890L;
@Override
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
String admin = servletConfig.getInitParameter("admin");
String email = servletConfig.getInitParameter("email");
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.print("<html><head></head><body>" +
"Admin:" + admin +
"<br/>Email:" + email +
"</body></html>");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
使用额GenericServlet类的代码要比上面的直接实现Servlet接口的代码要干净很多
我们不需要自己保存ServletConfig对象,因为GenericServlet帮我们做了,我们也不需要实现所有的生命周期方法
我们需要做的仅仅是在service方法中编写我们的实现即可
现在我们来谈一谈Servlet API中的第二个包,javax.servlet.http
javabean
javabean属性
simple
get
set
就是普通成员变量的set和get方法
|
|