Servlet是用Java编写的运行在Web服务器中的程序,因此它可以调用服务器端的类,也可以被调用,它本身也就是一个类。
PS:要注意区分Servlet、JavaScript以及Java Applet。JavaScript是运行在客户端浏览器中的脚本程序;Java Applet是运行在客户端的Java小程序;而Servlet是运行在服务器端的程序。
JSP页面编写完毕后,在Web引擎中运行前也会被编译器先转换为Servlet,在编译成字节码文件,因此JSP页面与Servlet是一一对应的。
Servlet的工作原理
Servlet由Web服务器引擎复杂编译执行,当客户端浏览器访问Servlet时,服务器将启动一个线程来响应,而并非CGI技术的进程。因此相对CGI方式占用的系统资源(特别是内存)比较少,具有较高的运行效率。
当Web服务器中的Servlet被请求访问时,此Servlet被加载到Java虚拟机中,在Servlet中要接受HTTP请求并作出相应处理。由于Servlet是在服务器运行的,对客户完全透明,因此比Java Applet具有更好的安全性,当服务器有防火墙的保护时,Servlet也受到防火墙的保护。
Servlet相关的类和方法
要开发Servlet重点要掌握javax.servlet.http.HttpServlet类。javax.servlet.http.HttpServlet类的声明情况如下:
1 | public abstract class HttpServlet extends GenericServlet implements java.io.Serializable |
可见在HttpServlet类中实现了Serializable接口,也就是说已经作了串行化处理,开发人员在继承HttpServlet类后不必再作串行化处理,简化了编程。
HttpServlet类是一个抽象的类,用于创建一个基于HTTP协议的Servlet,在继承它的类中必须实现以下方法中的至少一个:
doGet()
此方法通过service()方法被调用,用于在Servlet中处理一个GET请求。在此方法中,开发人员常编写代码来读取请求(request)中的数据,完成响应(response)头中的设置,取得回应的输出流对象,再通过这个输出流对象来输出数据。
1
protected void deGet(HttpServlet req,HttpServlet resp) throws ServletException,Java.io.IOException
doPost()
此方法通过service()方法被调用,用于在Servlet中处理一个POST请求。方法的其他说明同doGet()方法。
1
protected void dePost(HttpServlet req,HttpServlet resp) throws ServletException,Java.io.IOException
service()
servide()方法接收客户端的请求,并将请求转发给已定义的doXxxx()方法
1
protected void service(HttpServlet req,HttpServlet resp) throws ServletException,Java.io.IOException
init()
此方法继承自GenericServlet类,用于对Servlet容器中的当前Servlet作初始化处理
1
public void init(ServletConfig config) throws ServletException
destory()
当前Servlet在生命周期结束时调用此方法
1
public void destory()
web.xml
< web-app > < /web-app >标签
< web-app>< /web-app>是部署描述的根元素,该元素含23个子元素。在Servlet2.3中,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的< web-app>元素有< servlet>和< servlet-mapping>两个子元素,则< servlet>子元素必须出现在< servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。
< display-name>< /display-name>标签
< display-name>< /display-name>定义web应用的名称。如
1
<display-name>trk-order-rest</display-name>
< distributable/>
< distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。
< session-config>< /session-config>标签
< session-config> 用于设置容器的session参数,比如:< session-timeout>用于指定http session的失效时间。默认时间设置(30minutes)。< session-timeout>用来指定默认的会话超时时间间隔,以分钟为单位。该元素值为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。
1
2
3<session-config>
<session-timeout>30<ession-timeout>
</session-config>< filter>< /filter>标签
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
详细了解可以去看看这位大佬的博客:http://www.cnblogs.com/vanl/p/5742501.html
< listener>< /listener>标签
监听器Listener就是在application,session,request三个对象创建,销毁,或者往其中添加修改删除属性时自动执行代码的功能组件。Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。
详细了解可以去看看这位大佬的博客:http://www.cnblogs.com/vanl/p/5753722.html
< servlet>< /servlet>标签
Servlet通常称为服务端小程序,是服务端的程序,用于处理及响应客户的请求。Servlet是一个特殊的Java类,创建Servlet类自动继承HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外HttpServlet有两个方法:
init(ServletConfig config):创建Servlet实例时,调用该方法初始化Servlet资源。
destory():销毁Servlet实例时,自动调用该方法回收资源。
通常无需重写init()和destory()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法。如果重写了init()方法,应该在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完先完成某些资源的回收,比如关闭数据库链接,才需要重写destory()方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<servlet>
<servlet-name>passwordServer</servlet-name> //服务器名字
<servlet-class>org.password.server.PasswordServer</servlet-class>//类
</servlet>
<servlet>
<servlet-name>personServer</servlet-name>
<servlet-class>org.password.server.PersonServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>personServer</servlet-name>//名字 与上面对应
<url-pattern>/personServer</url-pattern>//Web访问Servlet时相对路径
</servlet-mapping>
<servlet-mapping>
<servlet-name>passwordServer</servlet-name>
<url-pattern>/passwordServer</url-pattern>
</servlet-mapping>
< welcome-file-list> < /welcome-file-list>标签
< welcome-file>用来指定首页文件名称。< welcome-file-list>元素可以包含一个或多个< welcome-file>子元素。如果在第一个< welcome-file>元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。
1
2
3<welcome-file-list>
<welcome-file>view/login.jsp</welcome-file>
</welcome-file-list>
简单应用
用Servlet获取表单数据
JSP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form mathod="post" action="${pageContext.request.contextPath}/user" name="form1">//${pageContext.request.contextPath}是获取绝对路径
用户注册<br>
用户名:<input type="text" name="username" size="20"><br>
密 码<input type="password" name="password" size="20"><br>
性别:<input type="radio" value="男" name="sex">男<input type="radio" name="sex" value="女">女<br>
电子邮箱:<input name="email" maxlength=28><br>
家庭住址:<input type="text" name="address" size="20"><br>
<input type="submit" value="提交" name="b1" ><input type="reset" value="全部重写" name="b2"><br>
</form>
</body>
</html>
web.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<servlet-name>UserRegist</servlet-name>
<servlet-class>test.UserRegist</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserRegist</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Servlet
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
38import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserRegist extends HttpServlet{
public String codeToString(String str){
String s=str;
try{
byte temp[]=s.getBytes("ISO-8859-1");
s=new String(temp);
return s;
}catch (Exception e){
return s;
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html;charset=GB2312");
PrintWriter out=response.getWriter();
out.println("<html><head><title>用户注册</title></head><body>");
out.println("这是新用户注册所提交的数据<br>");
out.println("用户名是:"+codeToString(request.getParameter("username"))+"<br>");
out.println("密码是:"+codeToString(request.getParameter("password"))+"<br>");
out.println("性别是:"+codeToString(request.getParameter("sex"))+"<br>");
out.println("电子邮箱是:"+codeToString(request.getParameter("email"))+"<br>");
out.println("家庭住址是:"+codeToString(request.getParameter("address"))+"<br>");
out.println("</body></html>");
}
}