Servlet概述
Java Web应用程序中的所有请求-响应都是由Servlet来完成的。Servlet是Java Web应用的核心,所有请求最终都交给Servlet来处理。当用户访问服务器的时候,Tomcat通过调用Servlet的某些方法来完成整个处理过程。
编写Servlet时直接继承HttpServlet,并覆盖需要的方法,一般只覆盖doGet()与doPost()方法。方法中参数类型HttpServletRequest与HttpServletResponse分别为客户端请求与服务器端响应。
Servlet工作流程
Servlet是建立在http规范基础上的。Web访问中最常用的是GET与POST访问方式。用户访问Web程序的时候,浏览器提交的请求是遵循HTTP协议的文本。这段文本由支持Servlet的web服务器也就是Tomcat接收并解析,Tomcat会调用Servlet方法完成相应的处理。当浏览器以GET方式访问Servlet是,Servlet会执行doGet()方法,以POST方式时则调用doPost()方法。
HTTP请求被封装成了HttpServletRequest类型的request对象,所有的HTTP头数据都可以通过request相应的方法获得。HTTP相应输出流封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制输出的内容。Tomcat调用Servlet相应的方法时把request、response对象作为参数传递给这些方法。
Java Web目录结构
Web程序部署在Tomcat的“webapps”下面,一个webapps文件夹可以部署多个不同的web应用程序,例如“webapps/app1”、"webapps/web2",访问时网址分别为"localhost:8080/web1"、“localhost:8080/web2”。这两个不同的web应用程序分别称为两个上下文(Context),路径“/web1”、“/web2”也称为上下文路径(ContextPath)。
如果不适用上下文路径,Web程序需放到“webapps/ROOT”下面,ROOT文件夹下的程序使用“localhost:8080/”访问。
编写Servlet
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.log("执行doGet方法");
this.excute(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.log("执行doPost方法");
this.excute(request, response);
}
//执行方法
private void excute(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
{
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
String requestUrl = request.getRequestURI();
String method = request.getMethod();
String param = request.getParameter("param");
response.setContentType("text/html");//设置文档类型为html类型
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head><title>A Servlet Demo</title></head>");
out.println("<body>");
out.println("以"+method+"方式访问该页面。取到的param参数为:"+param+"</br>");
out.println("<form action='"+requestUrl+"' method='get'>");
out.println("<input type='text' name='param' value='param value' >");
out.println("<input type='submit' value='以get方式查询页面"+requestUrl+"' >");
out.println("</form>");
out.println("<form action='"+requestUrl+"' method='post'>");
out.println("<input type='text' name='param' value='param value' >");
out.println("<input type='submit' value='以get方式查询页面"+requestUrl+"' >");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.flush();
out.close();
}
}
配置Servlet
只有Servlet类文件还不行,Web容器必须知道浏览器如何访问这个Servlet,也就是说,浏览器地址输入什么样的 URL才能访问这个Servlet,这需要配置Servlet的类文件与URL访问方式。这个配置在Web应用程序的描述文件web.xml里完成。首先要配置Servlet的名称以及类名。名称与类名使用标签<servlet>配置。FirstServlet配置描述如下所示,
<servlet>
<!-- Servlet名称 -->
<servlet-name>FirstServlet</servlet-name>
<!-- 所在的包 -->
<servlet-class>com.servlet.FirstServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<!-- 如果配置为1,Tomcat会在启动的时候加载该Servlet;如果配置为0, Tomcat会在第一次请求该Servlet的时候才加载该Servlet-->
</servlet>
<servlet-name>中间的内容可以使用任意字母组合,同时必须保证名称在web.xml里是唯一的。该名称会被其他的标签如<servlet-mapping>、<filter>等使用。
配置<servlet-mapping>
<servlet-mapping>
<!-- 也就是前面<servlet>标签配置的Servlet名称 -->
<servlet-name>FirstServlet</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/demo/FirstServlet</url-pattern>
</servlet-mapping>
标签<servlet-name>说明该访问方式映射的Servlet名称,也就是前面<servlet>标签配置的Servlet名称。<url-pattern>值前面加上Web应用程序的路径(本例为“/servlet”),再加上服务器域名及端口号信息就是访问该Servlet的具体网址。本例中FirstServlet访问网址为“http://localhost:8080/servlet/demo/FirstServlet”。<servlet-mapping>也可以配置多个<url-pattern>,如下所示:
<servlet-mapping>
<!-- 也就是前面<servlet>标签配置的Servlet名称 -->
<servlet-name>FirstServlet</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/demo/FirstServlet</url-pattern>
<url-pattern>/demo/FirstServlet.html</url-pattern>
<url-pattern>/demo/FirstServlet.php</url-pattern>
<url-pattern>/demo/FirstServlet.asp</url-pattern>
</servlet-mapping>
运行效果图
都是有