• 第二章 编写与设置Servlet


    • 2.1 第一个Servlet
    package cc.openhome;
    
    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;
    
    /**
     * Created by Administrator on 2016/4/6.
     */
    @WebServlet("/hello.view")
    //继承HttpServlet public class HelloServlet extends HttpServlet { //重新定义doGet() @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应内容类型 resp.setContentType("text/html;charset=UTF-8"); //取得响应输出对象 PrintWriter out = resp.getWriter(); //取得“请求参数” String name = req.getParameter("name"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello Servlet</title>"); out.println("</head>"); out.println("<body>"); //输出Hello out.println("<h1>Hello! " + name + " !</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } }
    • 2.2 在HelloServlet之后

    关于HttpServlet

    使用@WebServlet

    @WebServlet("/hello.view")
    //继承HttpServlet
    public class HelloServlet extends HttpServlet {

    只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息,上面的@WebServlet告诉容器,如果请求的URL是"/hello.view",则由HelloServlet的实例提供服务。

        @WebServlet(
            name="Hello",
            urlPatterns={"/hello.view"},
            //启动程序后就要初始化Servlet,数字表示初始化顺序
            laodOnStartuo=1
        )
        public class HelloServlet extends HttpServlet {}

    使用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>
            <!--注册的Servlet名称-->
            <servlet-name>HelloServlet</servlet-name>
            <!--设置的实体类名称-->
            <servlet-class>cc.openhome.HelloServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <!--设置的逻辑名称,若有客户端请求/helloUser.view,则由这个Servlet来处理-->
            <url-pattern>helloUser.view</url-pattern>
        </servlet-mapping>
    </web-app>

    文件组织与部署

    WEB-INF:这个目录名称是固定的,而且一定是位于应用程序根目录下。放置在WEB-INF中的文件或目录,对外界来说是封闭的,也就是客户端无法使用HTTP的任何方式直接访问WEB-INF文件或目录。

    web.xml:是Web应用程序部署描述文件,一定是放在WEB-INF根目录下

    lib:放置JAR文件的目录,一id那个放在WEB-INF根目录下

    classes:放置编译过后.class文件的目录,一定是放在WEB-INF目录下。编译过后的类文件,必须有与包名称相符的目录结构。

    • 2.3 进阶部署设置

    URL模式设置

    requestURI = contextPath + servletPath + pathInfo

    1、环境路径:使用HttpServletRequest的getRequestURI()来取得这项信息,其中contextPath是环境路径(Context Path),是容器用来决定该挑选哪个Web应用程序的依据

    可使用HttpServletRequest的getContextPath()来取得环境路径。决定哪个Web应用程序来处理后,就进行Servlet挑选,Servlet必须设置URL模式。

    路径映射:以“/”开头,但以“/*”结尾的URL模式。/guest/test.view

    扩展映射:以“*.”开头的URL模式。若URL模式设置为*.view结尾的请求,都会交由该Servlet处理

    环境根目录映射:空字符串“”是一个特殊的URL模式,对应至环境根目录,也就是"/"的请求。

    预设Servlet:仅包括“/”的URL模式,当找不到合适的URL模式对应时,就会使用预设的Servlet。

    完全匹配:不符合以上设置的其他字符串,都要作路径的严格对应。

    2、Servlet路径:直接对应至URL模式信息,可使用HttpServletRequest的getServletPath()来取得

    3、路径信息:指不包括环境路径与Servlet路径部分的额外路径信息,可使用HttpServletRequest的getpathinfo()来取得。

    package cc.openhome;
    
    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;
    
    /**
     * Created by Administrator on 2016/4/6.
     */
    
    //继承HttpServlet
    public class HelloServlet extends HttpServlet {
        //重新定义doGet()
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置响应内容类型
            resp.setContentType("text/html;charset=UTF-8");
            //取得响应输出对象
            PrintWriter out = resp.getWriter();
            //取得“请求参数”
            String name = req.getParameter("name");
    
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Hello Servlet</title>");
            out.println("</head>");
            out.println("<body>");
            //输出Hello
            out.println("<h1>Hello! " + name + " !</h1>");
            
            out.println(req.getRequestURI() + "<br>");
            out.println(req.getContextPath() + "<br>");
            out.println(req.getServletPath() + "</body>");
            out.println(req.getPathInfo() + "</hetml>");
    
            out.close();
        }
    }

    Web目录结构

    一个Web应用程序基本有以下几个部分:

    静态资源、Servlet、JSP、自定义类、工具类、部署描述文件(web.xml)设置信息(Annotation)

    /WEB-INF中资源项目的名称与结构:

    /WEB-INF/web.xml是部署描述文件

    /WEB-INF/classes用来放置应用程序用到自定义类(.class),必须包括包(Package)结构

    /WEB-INF/lib放置应用程序用到JAR文件。

    使用web-fragment.xml

    1、web-fragment.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-fragment 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>
            <!--注册的Servlet名称-->
            <servlet-name>HiServlet</servlet-name>
            <!--设置的实体类名称-->
            <servlet-class>cc.openhome.HiServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>HiServlet</servlet-name>
            <!--设置的逻辑名称,若有客户端请求/helloUser.view,则由这个Servlet来处理-->
            <url-pattern>hi.view</url-pattern>
        </servlet-mapping>
    </web-fragment>

    2、web.xml与web-fragment.xml

    使用<absolute-ordering>定义绝对顺序

        <absolute-ordering>
            <name>WebFragment1</name>
            <name>WebFragment2</name>
        </absolute-ordering>

    web-fragment.xml使用<ordering>,在其中使用<before>或<after>来定义顺序

    3、metadata-complete属性

    如果将web.xml中<web-app>的metadata-complete属性设置为true,则表示web.xml中已完成Web应用程序的相关定义,部署时将不会扫描标注与web-fragment.xml中定义,xml中<absolute-ordering>与<ordering>也会被忽略。

  • 相关阅读:
    微服务2:微服务全景架构
    SystemVerilog语言简介
    Slip打包与解包及MATLAB程序
    恶性卷积码
    通信原理之调制解调(2)QPSK
    FPGA仿真只适合开发定制IP的设计师?
    用CCS开发DSP应用程序的代码结构、加电装载及在线编程
    符号能量问题
    该如何选择?
    无线通信距离的计算
  • 原文地址:https://www.cnblogs.com/beaconSky/p/5368172.html
Copyright © 2020-2023  润新知