Servlet基础

来源:互联网 发布:淘宝店铺复古港风推荐 编辑:程序博客网 时间:2024/06/15 20:19

一、什么是Servlet

Servlet是在服务器上运行的小程序。
一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序。


二、Tomcat容器等级

这里写图片描述


三、手写第一个Servlet

这里写图片描述

注意:页面中的/代表服务器根目录,web.xml中/代表项目根目录,请求重定向的/代表服务器根目录,请求转发的/代表项目根目录。

index.jsp :
超链接地址不能用/servlet/HelloServlet,因为第一个/表示服务器的根目录,而不是上下文地址(项目根目录)。
表单中action=”servlet/HelloServlet”与超链接地址写法相同。

<%@ page contentType="text/html;charset=UTF-8" language="java" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>首页</title>  </head>  <body>  <h1>第一个Servlet</h1>  <hr>  <a href="servlet/HelloServlet" target="_blank">Get请求</a>  <hr>  <form action="servlet/HelloServlet" name="loginForm" method="post">    <table>      <tr>        <td>用户名:</td>        <td><input type="text" name="username"/></td>      </tr>      <tr>        <td>密码:</td>        <td><input type="password" name="password"/></td>      </tr>      <tr>        <td colspan="2"><input type="submit" value="登录"></td>      </tr>    </table>  </form>  </body></html>

web.xml : url-pattern格式:/servlet/HelloServlet,必须以/开头,表示的是项目根目录

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">    <servlet-mapping>        <servlet-name>HelloServlet</servlet-name>        <url-pattern>/servlet/HelloServlet</url-pattern>    </servlet-mapping>    <servlet>        <servlet-name>HelloServlet</servlet-name>        <servlet-class>servlet.HelloServlet</servlet-class>    </servlet></web-app>

servlet.HelloServlet :
请求重定向的地址: resp.sendRedirect(req.getContextPath() + “/index.jsp”);
服务器内部跳转:request.getRequestDispatcher(“/index.jsp”).forward(request, response); 或者使用 “../index.jsp”

编写Servlet的doPost方法时,需要抛出ServletExcpetion和IOException异常。

package servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;public class HelloServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        System.out.println("GET请求");        resp.setContentType("text/html;charset=UTF-8"); //以html格式响应        PrintWriter out = resp.getWriter();        out.println("<strong>Hello</strong>");        //重定向的地址        resp.sendRedirect(req.getContextPath() + "/index.jsp");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        System.out.println("POST请求");        resp.setContentType("text/html;charset=UTF-8"); //以html格式响应        PrintWriter out = resp.getWriter();        out.println("username: " + req.getParameter("username") + "<br>");        out.println("password: " + req.getParameter("password") + "<br>");    }}

Servlet3.0新特性(得Tomcat7.0版本及以上)
不会自动在web.xml中生成该Servlet对应的mapping信息,而是在Servlet代码中加入注解@WebServlet

/** * 注解WebServlet用来描述一个Servlet * 属性name描述Servlet的名字,可选 * 属性urlPatterns定义访问的URL,或者使用属性value定义访问的URL.(定义访问的URL是必选属性) */@WebServlet(name="",urlPatterns="/xxx")

四、Servlet执行流程与生命周期

这里写图片描述

这里写图片描述

Servlet容器装载Servlet:

这里写图片描述
Tomcat是通过反射来创建servlet实例的
初始化后的Servlet实例长期驻留在服务器内存

Servlet工作流程分为三个阶段。init(初始化),service(运行),destroy(销毁)
Servlet没有main方法,所有行为由Container控制。Container就是一个java程序。
在加载Servlet的.class后,Servlet会由构造函数生成一个实例,然后Container调用init()方法完成参数的初始化,接着调用service()方法,service会根据网页的请求,调用doGet或者doPost方法,最后调用销毁方法。整个流程如下图:
这里写图片描述


五、Servlet与JSP九大内置对象

这里写图片描述


六、Servlet与JSP比较

1> JSP也是Servlet,它其实就是为了能够更方便的输出数据到客户端,JSP能做的事,只要不怕费事,Servlet一样可以完成。
2> Servlet是被Context的类加载器加载的,所以重写Servlet需要重新部署Context,JSP有自己的加载器,所以在你修改了JSP文件之后,没感觉服务器有什么动作,修改内容就显示出来了。
3> JSP封装了大量Servlet中的对象,例如Request,ServletContext,Session等,使用起来极其方便。
4> JSP是 可视化文件,Servlet会被编译成class文件,前者可以拿任何一个编辑器修改,后者不行
这里写图片描述

理解以下三点即可:
1、不同之处在哪?
Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容
JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
2、各自的特点
Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的
3、通过MVC双剑合璧
既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
Controller——负责转发请求,对请求进行处理(Servlet)
View——负责界面显示(JSP)
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现(JavaBeans)
在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:
这里写图片描述

web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。


七、获取初始化参数

在web.xml中可以配置servlet初始化参数。在servlet中可以通过ServletConfig接口来获取这些参数。

web.xml :

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">    <servlet-mapping>        <servlet-name>TestServlet1</servlet-name>        <url-pattern>/servlet/TestServlet1</url-pattern>    </servlet-mapping>    <servlet>        <servlet-name>TestServlet1</servlet-name>        <servlet-class>servlet.TestServlet1</servlet-class>        <init-param>            <param-name>username</param-name>            <param-value>mook</param-value>        </init-param>        <init-param>            <param-name>password</param-name>            <param-value>123456</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet></web-app>

TestServlet1.java :

/**     * Initialization of the servlet. <br>     *     * @throws ServletException if an error occurs     */    public void init() throws ServletException {        // Put your code here        System.out.println("TestServlet1的init()方法...");        System.out.println(this.getInitParameter("username"));        System.out.println(this.getInitParameter("password"));        System.out.println(this.getServletConfig().getInitParameter("username"));    }

启动服务器,部署项目:

TestServlet1构造方法....TestServlet1的init()方法...mook123456mook
原创粉丝点击