• 【温故知新】Java web 开发(二)Servlet 和 简单JSP


    系列一介绍了新建一个 web 项目的基本步骤,系列二就准备介绍下基本的 jsp 和  servlet 使用。

    (关于jsp的编译指令、动作指令、内置对象不在本文讨论范围之内)

    1. 首先,在 pom.xml 文件中添加 jsp 和 servlet 的支持包。

    <dependencies>

        <dependency>

            <groupId>javax.servlet</groupId>

            <artifactId>javax.servlet-api</artifactId>

            <version>3.1.0</version>

        </dependency>

        <dependency>

            <groupId>javax.servlet.jsp</groupId>

            <artifactId>jsp-api</artifactId>

            <version>2.2</version>

        </dependency>

        <dependency>

            <groupId>javax.servlet</groupId>

            <artifactId>jstl</artifactId>

            <version>1.2</version>

        </dependency>

    </dependencies>

    2. 编写第一个处理请求的 servlet。

    所有的 servlet 必须继承 HttpServlet 才能具备处理和响应 HTTP 请求的能力,这也是上边依赖添加的必要性。子类 servlet 只需要重写 doGet() 方法就能自定义对 GET 请求的处理,重写 doPost() 方法能处理 POST请求,其它还有 doPut()、doDelete()等方法。

    如果你熟悉 HttpServlet 的相关知识,就会知道重写 service() 方法也能达到目的,因为这个才是处理请求的中枢方法,它负责处理请求,并根据请求类型分配到指定方法上去,如下图所示:

     

    下边给出第一个 servlet 实例。

    public class HelloServlet extends HttpServlet{

        @Override

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            request.setCharacterEncoding("UTF-8");

            System.out.println(request.getQueryString());

            String name = request.getParameter("name");

            String gender = request.getParameter("gender");

            PrintStream out = new PrintStream(response.getOutputStream());

            out.println("<html>");

            out.println("<head>");

            out.println("<title>Servlet测试</title>");

            out.println("</head>");

            out.println("<body>");

            out.println("您的名字是:" + name + " <hr/>");

            out.println("您的性别:" + gender + " <hr/>");

            out.println("</body></head>");

        }

    }

    这是一种经典的处理和相应方式,采用的是 response 对象的 输出流直接拼写页面,然后返回给客户端。还有其它的方式,比如 jsp 页面,这个后边会具体描述。

    PS: servlet 的生命周期以及init()、destroy() 方法也要掌握一下。

    3. 在 web.xml 中配置请求的映射

    虽然 HelloServlet 以及具备了处理请求的能力,但是它具体用来处理那种样式的 URL 请求还没有配置,而这个是在 web.xml 中决定的。在 web.xml 的 web-app 元素里添加如下的代码:

        <servlet>

            <servlet-name>helloServlet</servlet-name>

            <servlet-class>Servlet.HelloServlet</servlet-class>

        </servlet>

        <servlet-mapping>

            <servlet-name>helloServlet</servlet-name>

            <url-pattern>/hello</url-pattern>

        </servlet-mapping>

    这样子就把 HelloServlet 绑定来处理 /hello 的请求了。

    4. 请求实例

     

    5. 重要知识点

    l  Servlet 3.0 开始,可以使用 @WebServlet 注解来代替 web.xml 中配置请求模式的操作,可以说是很方便了。下图演示了这一点,以及重写 service() 方法。

    l  事实上,Servlet 2.5 规范之后,web.xml的必要性就不复存在了,原因大概在于 注解的强势崛起吧。不过,我们在开发的时候仍习惯于保留这个 web.xml,然后同时活用注解的方式。

    @WebServlet(name="worldServlet", urlPatterns = {"/world"})

    public class WorldServlet extends HttpServlet {

        @Override

        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            request.setCharacterEncoding("UTF-8");

            System.out.println(request.getQueryString());

            String world = request.getParameter("world");

            PrintStream out = new PrintStream(response.getOutputStream());

            out.println("<html>");

            out.println("<head>");

            out.println("<title>world测试</title>");

            out.println("</head>");

            out.println("<body>");

            out.println("您的世界是:" + world + " <hr/>");

            out.println("</body></head>");

        }

    }

     

    l  除了在 servlet 的处理方法中直接写回输出页面之外,还可以采用 jsp 的方式响应请求。而事实上,jsp 就是一种特殊的 servlet,它由 web 容器(比如 tomcat)负责编译生成 servlet,感兴趣的可以自己查阅资料,具体来说页面跳转的方式,使用 request.forward("/process.jsp")方法。(还有重定向的方式,开发人员还是需要区分两者的,这里不提)

    Servlet 代码如下所示:

    @WebServlet(name = "thirdServlet", urlPatterns = {"/third"})

    public class ThirdServlet extends HttpServlet {

        @Override

        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //        request.getRequestDispatcher("/WEB-INF/page/process.jsp").forward(request,response);

            request.getRequestDispatcher("/outer_process.jsp").forward(request,response);

        }

    }

    process.jsp内容如下,放置在/WEB-INF/page下,在外部也有一个相同内容(除了 title)的文件outer_process.jsp,这是为了演示他们在使用forward时的不同,因为WEB-INF下的文件无法直接在浏览器访问。

     

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>

    <html>

    <head>

        <title>处理页</title>

    </head>

    <body>

        <!-- 使用 jsp 内置对象 out(javax.servlet.jsp.JspWriter) 来输出当前时间,刷新可更新时间。 -->

        <%

            out.println(new java.util.Date());

        %>

        <!-- 使用 jsp 内置对象 request 来获取参数 -->

        <%

            String name = request.getParameter("name");

            Integer age = Integer.parseInt(request.getParameter("age"));

        %>

        您的名字是: <%=name%><hr/>

        您的年龄是:<%=age%><hr/>

    </body>

    </html>

     

     

  • 相关阅读:
    SDN期末作业验收
    SDN第五次上机作业
    SDN第四次作业
    SDN第四次上机作业
    SDN第三次上机
    SDN第三次作业
    第二次SDN上机作业
    SDN第二次作业
    SDN第一次上机作业
    SDN第一次作业
  • 原文地址:https://www.cnblogs.com/bityinjd/p/9279494.html
Copyright © 2020-2023  润新知