一、Servlet继承体系
------|Servlet 接口
-------------| GenericServlet 类,已经实现了Servlet接口
-------------| HttpServlet 如果是get的请求方式调用doGet(),如果是post的请求方式调用doPost()
二、开发Servlet程序
Servlet 本身不能独立运行,需要在一个web应用中运行,而一个web应用是部署在Web服务器上的,常用的Web服务器有:Tomcat、Jboss等。
开发一个servlet:
1、创建web应用项目
2、编写servlet代码
3、部署到tomcat中
三、Servlet代码
1. 实现Servlet接口
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
/*
request: 代表了用户的请求信息,用户提交的所有数据都会被封装到request对象中
response: 代表了服务器给浏览器的响应信息
*/
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
//解决向浏览器输出中文乱码问题
response.setContentType("text/html;charset=utf-8");
//向浏览器输出数据,应该使用response对象,浏览器与服务器的通讯是基于io流通讯
PrintWriter out = response.getWriter();
out.write("Hello Servlet");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2. Service() doGet()/ doPost()
HttpServlet 里的三个方法:
service(HttpServletRequest req, HttpServletResponse resp), doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)
的区别和联系:
service() 在javax.servlet.Servlet
接口中定义,在javax.servlet.GenericServlet
中实现,而 doGet()/doPost()
则是在 javax.servlet.http.HttpServlet
中实现的,javax.servlet.http.HttpServlet
是 javax.servlet.GenericServlet
的子类。所以可以这样理解,其实所有的请求均先由 service() 进行处理,在 javax.servlet.http.HttpServlet
的 service 方法中,主要做的事情就是判断请求类型是 Get 还是 Post,然后调用对应的 doGet()/doPost()
执行;但是如果你重载了service方法,默认操作被覆盖,不再进行转发操作!
四、web.xml 配置文件
在 Servlet2.5 规范之前,Java Web应用的绝大部分组件都通过web.xml文件来配置管理,而 Servlet3.0 规范可通过Annotation来配置管理Web组件,因此web.xml文件可以变得更加简洁,这也是Servlet3.0的重要简化。
1. 通过web.xml
<servlet>
<servlet-name>HelloServlet</servlet-name> //Servlet名字
<servlet-class>com.zz.HelloServlet</servlet-class> //Servlet 具体实现类路径
<!-- 通过servletConfig getInitParameter()取出参数 -->
</servlet>
<servlet-mapping> //地址映射
<servlet-name>HelloServlet</servlet-name> //Servlet 名字
<url-pattern>/hello</url-pattern> //URL,访问servlet的url链接
</servlet-mapping>
配置上述路径时,<servlet-name>HelloServlet</servlet-name>
中的命名不一定要和HelloServlet.java
的命名一样,web.xml中配置只是一个名字,我们只要保证具体的<servlet-class>com.zz.HelloServlet</servlet-class>
正确,就可以找到相应的Servlet
2. 使用@WebServlet 注解
Servlet3.0
相较于 Servlet2.5
:新增了一些注解,简化了 JavaWeb 代码开发,可以省略 web.xml
配置文件,支持异步处理(多线程技术),支持可插性(书写的代码编译后生成的class文件可以直接部署到其他项目并自动加载执行)等。
@WebServlet(urlPatterns="/hello")
public class HelloServlet extends HttpServlet
@WebServlet支持的常用属性:displayName,initParams,loadOnStartup,name,urlPatterns/value,asyncSupported
使用Annotation来配置Servlet需要注意:
1)不要在web.xml文件的根元素(<web-app>
)中指定metadata-complete="true"
;
2)不要在web.xml文件中配置该Servlet。
3. 通过web.xml如何找到Servlet
1)输入网址 http://localhost:8080/HelloServlet/hello
,通过该请求扫描web.xml文件下所有Servlet,找到<servlet-mapping>...</servlet-mapping>
中<url-pattern>
为hello的Servlet,得到<servlet-name>
2)通过<servlet-name>
得到Servlet具体实现类路径,如:<servlet-class>com.zz.HelloServlet</servlet-class>
3)通过<servlet-class>com.zz.HelloServlet</servlet-class>
定位到 com.zz包下HelloServlet.java文件
五、web.xml 其他配置
1. web.xml中配置默认首页访问
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
2. 设置Servlet自启动
有时 Tomcat 一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等,所以就需要Servlet实现自启动,在初始化方法init()
中,就可以进行一些业务代码的工作了。
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<load-on-startup>的取值范围为0-99,表示启动优先级,优先级最高为0