• 第二章 编写与设置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>也会被忽略。

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/beaconSky/p/5368172.html
Copyright © 2020-2023  润新知