Java Servlet(server Applet)是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。
Servlet容器必须要部署到Servlet容器(Web服务器)才能运行,Tomcat就是这样一款Servlet容器。
Apache Tomcat是一款JavaServlet和Java Server Pages技术的开源软件实现,可以作为测试Servlet的独立服务器。
Servlet是如何运作的
比如:在浏览器地址输入“http://ip:port/web01/greeting”
① 浏览器依据ip,port建立与服务器之间的连接。
② 浏览器将请求数据打包(依据http协议)。
③ 浏览器发送请求。
④ 服务器解析请求数据包,将解析的结果写入到request对象上,同时,服务器还会创建一个response对象。
⑤ 服务器依据请求资源路径(/web/greeting)找到对应的Servlet类名。接下来要创建Servlet对象。
⑥ 服务器调用Servlet的service方法,会将事先创建好的request,response对象作为参数传递进来。所以,可以通过request 对象获取获取请求数据,也可以通过response对象输出处理结果。
⑦ 服务器通过response对象获得处理结果,然后将处理结果打包,发送给浏览器。
⑧ 浏览器解析服务器返回的处理结果,然后生成相应的界面。
http://localhost:8080/web01/greeting?name=lbj
常见问题:
① 404
含义:服务器依据请求地址没有找到对应的资源
错误原因:请求地址写错、没有部署。
② 500
含义:系统错误
错误原因:程序代码不严谨。
③ 405
含义:找不到处理方法
错误原因:service方法不符合规范。
Servlet生命周期
什么是Servlet的生命周期?
Servlet容器创建Servlet对象,为其分配资源,调用其方法处理请求,以及销毁该对象的整个过程。
生命周期分成四个阶段:
① 实例化
Servlet容器调用Servlet的构造器,创建一个Servlet对象。
② 初始化
容器在创建好Servlet对象之后,会立即调用该对象的init方法。
③ 就绪(调用)
容器收到请求后调用Servlet对象的service方法来处理请求,service方法再派遣运行与请求相对应的doGet(),doPost()方法来处理用户请求。
④ 销毁
容器在删除servlet对象之前,会调用对象的destroy方法。
其中,①②④在整个生命周期只会被执行一次。
Servlet实例
Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet,并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求
HelloWorld示例代码
// 扩展 HttpServlet 类 public class HelloWorld extends HttpServlet { private String message; public void init() throws ServletException { // 执行必需的初始化 message = "Hello World"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html"); // 实际的逻辑是在这里 PrintWriter out = response.getWriter(); out.println("<h1>" + message + "</h1>"); } public void destroy() { // 什么也不做 } }
Servlet部署
web.xml文件中创建以下条目。
<web-app> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>
启动 tomcat 服务器,最后在浏览器的地址栏中输入 http://localhost:8080/HelloWorld。
Servlet表单数据
很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序。浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法。
① get方法
GET 方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔,如下所示:
http://www.test.com/hello?key1=value1&key2=value2
GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中。如果您要向服务器传递的是密码或其他的敏感信息,请不要使用 GET 方法。GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
这些信息使用 QUERY_STRING 头传递,并可以通过 QUERY_STRING 环境变量访问,Servlet 使用 doGet() 方法处理这种类型的请求。
② post方法
另一个向后台程序传递信息的比较可靠的方法是 POST 方法。POST 方法打包信息的方式与 GET 方法基本相同,但是 POST 方法不是把信息作为 URL 中 ? 字符后的文本字符串进行发送,而是把这些信息作为一个单独的消息。消息以标准输出的形式传到后台程序,您可以解析和使用这些标准输出。Servlet 使用 doPost() 方法处理这种类型的请求。
使用Servlet读取表单数据
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:
getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
String param = request.getParameter(String paramName);
getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
String[] values = request.getParameterValues(paramValue);
getParameterNames():将获取所有form表单中name属性为username的值.该方法返回一个数组.遍历数组就可得到value值.
String[] names = request.getParameterValues("username")
请求资源路径
http://ip:port 后面的就是请求资源路径。
http://localhost:8080/appName/xxx; appName可以是包名也可以是项目名。
在servlet类上运行就没有后缀,前面是包名。
在HTML和JSP页面上运行就有后缀(.html或.jsp),前面是项目名。
Web服务器对请求资源路径的处理过程:
①浏览器依据ip和port建立与Servlet容器之间的连接(通过配置Tomcat),然后将请求资源路径发送给容器。
②容器与产生应用/appName找到应用所在的文件夹,容器会默认请求的是一个Servlet,查询web.xml文件中所有的Servlet配 置,看是否有匹配的Servlet。
Servlet匹配规则
① 精确匹配
<url-pattern>/test.html</url-pattern>
尽管应用中有test.html这个具体的页面,也会去执行该<url-pattern>对应的Servlet,而不是具体的test.html页面。
② 模糊查询的通配符匹配
使用“*”来匹配0个或多个字符。
<url-pattern>/*</url-pattern>
输入任何不同的URL地址都将匹配成功。
③后缀匹配
不能使用斜杠开头,使用“*.”开头的任意多个字符。
<url-pattern>*.do</url-pattern>
会匹配以“.do”为后缀的所有请求。
通过后缀匹配可实现将多个请求交给一个Servlet处理。
Servlet网页重定向
当文档移动到新的位置,我们需要向客户端发送这个新位置时,我们需要用到网页重定向。当然,也可能是为了负载均衡,或者只是为了简单的随机,这些情况都有可能用到网页重定向。
什么是重定向:
服务器通知浏览器向一个地址发送请求。服务器可以向浏览器发送一个302状态码及一个Location消息头(包含重定向的地址),浏览器收到后立即向重定向地址发送请求。
重定向请求到另一个网页的最简单的方式是使用 response 对象的 sendRedirect() 方法。
response.sendRedirect(String url);
重定向的特点:
①重定向之后,浏览器地址栏的地址会改变。
②重定向之后,容器会先清空response对象缓存数据。
Servlet上下文
Servlet引擎为每一个WEB应用程序都创建了一个对应的ServletContext对象,ServletContext对象包含在ServletConfig对象中,调用 ServletConfig.getServletContext 方法可以返回该对象的引用。 由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象被称为application对象。
特点:
唯一性:一个WEB应用对应一个Servlet,只要容器不关闭,应用没被卸载,Servlet上下文就一直存在。
Servlet上下文绑定的数据可以被整个应用上的所有组件共享,并且一直可以访问。
应用:
①使用setAttribute 绑定数据
②使用removeAttribute 移除绑定数据
③使用getAttribute 获取绑定数据
例如:记录访问网站的总人数
当计数需要基于某一个特定的数字开始时,可以使用上下文配置参数,储存在web.xml中,所以当应用程序启动时,就可以读取这个初始值,再实现计数。
web.xml文件中:
<context-param> <param-name>count</param-name> <param-value> 0 </param-value> <context-param>
Servlet中:
public void service(){ PrintWriter out = response.getWriter(); ServletContext context = getServletContext(); Object count = context.getAttribute("count"); if(count!=null){ context.setAttribute("count",Integer.parseInt(count.toString()); }else if(count==null){ context.setAttribute("count",context.getInitParameter("count"); } out.println("总浏览量:"+context.getAttribute("count")); } }