Servlet介绍:
在JAVA WEB中,jsp的本质即是Servlet。Web容器中的jsp页面最终会将其编译成对应的Servlet。但为什么不直接使用Servlet呢?其原因大致有两个:
1. 开发效率低。特别是生存表现层页面时(即html页面),所有HTML标签都要使用out.println();来输出,这就足以看出其麻烦的程度。
2. 非程序员(页面的美术设计人员)一般难以参与Servlet页面的开发,因为Servlet是标准java类。
在写Servlet类的时候,必须继承HttpServlet。HttpServlet中提供了不同的方法用于响应客户端的请求:
1. doGet 用于响应GET请求
2. doPost 用于响应POST请求
3. doPut 用于响应PUT请求
4. doDelete 用于响应DELETE请求
5. doOptions 用于处理OPTIONS请求
6. doTrace 用于处理TRACE请求
当客户端发出相应请求时,就会调用响应的方法。而要注意的是,在写Servlet类的时候,需要重新定义这些方法,以能够作对应处理。当然,除此之外还有另外的方法:
1. service 用于判断客户端的请求类型,并调用相应的处理方法(若所有请求的处理是相同的,可直接重写这个方法)
2. getAllDeclaredMethods 获取指定类的所有方法
3. maybeSetLastModified 暂时不知道干嘛的
4. init 用于创建Servlet实例时,初始化Servlet资源
5. destroy 用于销毁Servlet实例时,回收资源
......
配置Servlet:
有两种配置Servlet的方式:
1. 在Servlet中用@WebServlet来配置(红色代码部分)
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintStream; @WebServlet(name="firstServlet",urlPatterns = {"/firstServlet"}) public class FirstServlet extends HttpServlet{ public void init() throws ServletException{ System.out.println("collected successful!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,java.io.IOException{ request.setCharacterEncoding("GBK"); response.setContentType("text/html;charSet=GBK"); String num=request.getParameter("number"); //request.setAttribute("res",num); PrintStream out=new PrintStream(response.getOutputStream()); out.println("<html>"); out.println("<head>"); out.println("<title>firstServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("res: "+(Integer.valueOf(num)*Integer.valueOf(num))); out.println("</body>"); out.println("</html>"); } }
2. 在web.xml中配置(红色代码部分)
<?xml version="1.0" encoding="UTF-8"?> <web-app 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_3_1.xsd" version="3.1"> <servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/firstServlet</url-pattern> </servlet-mapping> </web-app>
注:若在Servlet类的定义中及web.xml中均配置了不同的url,则以web.xml的为准
Servlet的生命周期:
有两种创建Servlet实例的情况:
1. 客户端首次请求某个Servlet时,系统会创建对应实例(大部分如此)
2. Web应用启动时,即刻创建(load-on-startup Servlet)
从Servlet创建实例到实例销毁的过程如下:
1. 创建实例
2. 初始化(调用init()方法)
3. 响应客户端请求(调用Servlet()方法)
4. 资源回收(调用destroy()方法)
5. 实例销毁
load-on-startup Servlet:
在上面已经说过,有两种创建Servlet实例的情况,而load-on-startup则是对应Web应用启动时即刻创建的情况。这种创建方式既可以在定义Servlet时,用@WebServlet来设定,也可在web.xml中设定。
load-on-startup可以看成一个优先值,数值越小,表示该Servlet实例创建的就越优先。
方式1: 在@WebServlet中设定
@WebServlet(loadOnStartup=1)
方式2: 在web.xml中设定
<servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>FirstServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
Servlet额外参数的配置和访问:
同样的,在Servlet中配置额外的参数也有两种方式:
方式1: 在@WebServlet中配置
@WebServlet(name="firstServlet",urlPatterns = {"/firstServlet"},initParams = { @WebInitParam(name="Username",value="Macrazds"), @WebInitParam(name="Password",value="abcd123") })
方式2: 在web.xml中设定
<servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>FirstServlet</servlet-class> <init-param> <param-name>Username</param-name> <param-value>Macrazds</param-value> </init-param> <init-param> <param-name>Password</param-name> <param-value>abcd123</param-value> </init-param> </servlet>
在Servlet中访问额外参数的指令:
public class FirstServlet extends HttpServlet{ public void init(ServletConfig config) throws ServletException{ super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,java.io.IOException{
//获取ServletConfig对象 ServletConfig config=getServletConfig();
//获取名为Username的额外参数的值 String username=config.getInitParameter("Username"); } }
Servlet作为控制器:
在这里先简略介绍一下MVC模式。MVC其实是三个部分的简称,即Model(模型)、View(视图)、Controller(控制器)。
在标准的MVC模式中,Servlet是仅作为控制器使用的,而JSP页面是作为视图,模型则是对应的JavaBean。
各部分的具体意义如下:
Model:指业务的规则(模型)。
View:指用户所见的可视交互界面。
Controller:作用是接收到来自View的数据后,进行对应请求的响应,并调用相关Model完成用户需求。
MVC具体的过程如下:
用户从View输入相关数据 / 发出业务请求
V
Controller接收业务请求,并将数据传到相关Model完成业务请求
V
Controller根据Model的处理结果选择不同的View
V
用户从跳转的View获得对应的反馈信息,并进行下一步操作