前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建servlet的4个步骤_映射不能一对多还是多对一

创建servlet的4个步骤_映射不能一对多还是多对一

作者头像
全栈程序员站长
发布2022-08-04 08:57:03
7150
发布2022-08-04 08:57:03
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一,Servlet接口实现类:sun公司为Servlet接口定义了两个默认的实现类,分别为:GenericServlet和HttpServlet。 HttpServlet:指能够处理HTTP请求的servlet,它在原有的Servlet接口上添加了一与HTTP协议处理的方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。 HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如果为GET请求,则调用HttpServlet的doGet方法,如果为POST请求,则调用doPost方法。因此开发人员在编写Servlet时,通常只需要覆写doGet方法或者doPost方法,而不要去覆写service方法。

在我们自己写的类去继承HttpServlet时应该注意以下几点: 1)Servlet初始化时覆盖init(),无需覆盖 init(config); 2)根据Http请求的方式,覆盖相应的doGet或者doPost方法,无需覆盖Service方法 3)当doGet和doPost方法代码逻辑相同时,可以相互调用,简化编程。

init() 和 init(ServletConfig) 关系 init(ServletConfig) 是Servlet生命周期的方法 ,GenericServlet内部 覆盖了 init(ServletConfig) ,在有参数init方法中调用无参数init ,建议 自定义Servlet只需要覆盖无参数 init 就可以了

配置 Servlet自动加载:如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 举例:

代码语言:html
复制
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
            org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

二,配置Servlet路径映射配置: 由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用元素和元素完成。 元素:用于注册Servlet,它包含有两个主要的子元素:和,分别用于设置Servlet的注册名称和Servlet的完整类名。 一个元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:和,分别用于指定Servlet的注册名称和Servlet的对外访问路径。 例如:

代码语言:html
复制
<web-app>
    <servlet>
        <servlet-name>AnyName</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AnyName</servlet-name>
        <url-pattern>/demo/hello.html</url-pattern>
    </servlet-mapping>
</web-app>

其中,URL-Pattern的三种配置方式 1、完全路径匹配:以/开始,不能包含通配符* 例如: /hello /init 2、目录匹配:以/开始, /*结尾 例如: /* /aa/* /aaa/bbb/* 3、扩展名匹配:不能以/开始,以开始 例如: .do *.action 优先级:完全匹配 > 目录匹配 > 扩展名匹配

注意: 1)同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。 2)在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式:一种格式是“.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。 例如:

代码语言:text
复制
<servlet-mapping>                 
    <servlet-name>
        AnyName
    </servlet-name>
    <url-pattern>
        *.do
    </url-pattern>
</servlet-mapping>
代码语言:html
复制
<servlet-mapping>
    <servlet-name>
        AnyName
    </servlet-name>
    <url-pattern>
        /action/*
    </url-pattern>
</servlet-mapping>

Web系统中的相对路径和绝对路径 相对路径:根据当前资源路径与目标资源路径,寻找相对位置关系,通过 . (当前目录) 和 .. (上一级目录)访问目标资源 例如: 在WebRoot下 新建 1.html 在WebRoot/aa 下新建 2.html 在1.html 和 2.html 分别通过超链接访问HelloServlet

代码语言:html
复制
1.html
<h1>相对路径</h1>
<a href="./hello">HelloServlet</a>
<a href="hello">HelloServlet</a>
<h1>绝对路径</h1>
<a href="http://localhost/day/hello">HelloServlet</a>
<a href="/day/hello">HelloServlet</a>

2.html
<h1>相对路径</h1>
<a href="../hello">HelloServlet</a>
<h1>绝对路径</h1>
<a href="http://localhost/day/hello">HelloServlet</a>
<a href="/day/hello">HelloServlet</a>
</body>

1.html 访问 HelloServlet 当前路径 http://localhost/day/1.html 目标路径 http://localhost/day/hello 位于同一个目录中 ./hello 、hello ===== 替换当前路径最后一个资源

2.html 访问 HelloServlet 当前路径 http://localhost/day/aaa/2.html 目标路径 http://localhost/day/hello 上一级目录中 ../hello ===== 替换上一级目录资源 相对路径,总需要分析当前路径与目标路径对应关系,编写规则会根据当前路径不同而不同

绝对路径:带有协议完整路径 (跨网站) http://localhost/day/hello 以/ 开始路径 (同一个站点内) : /day/hello 服务器端和客户端对于/ 的区别 客户端访问路径:/day/hello 服务器内部路径:/hello 结论:web访问中所有资源路径,都使用绝对路径

三,init方法中的ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数。当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。 ServletConfig对象和配置文件相关,其中的几个方法如下: String getServletName() :获取配置文件中servlet的名称; String getInitParameter(String name):获取初始化参数; Enumeration getInitParameterNames():获取初始化参数的名称们

四,Web应用对象:ServletContext WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。 ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

ServletContext的作用: 1)获取WEB应用的全局初始化参数

代码语言:text
复制
 在web.xml中配置
<context-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
</context-param>            
String getInitParameter(String name)      
getInitParameterNames() 

2)通过ServletContext对象实现数据共享(案例— 统计站点访问次数 )

代码语言:javascript
复制
void setAttribute(String name, Object object)   存入数据
void removeAttribute(String name)                   删除数据
Object getAttribute(String name)                       获取数据

3)利用ServletContext对象读取资源文件

代码语言:text
复制
InputStream getResourceAsStream(String path)    通过文件的地址获取输入流
String getRealPath(String path)         通过文件的地址获取文件的绝对磁盘路径

五,web project中读取文件总结 1,文件系统路径:getServletContext().getRealPath(“/WEB-INF/info.txt”) 2,类路径:classpath (src下): 1)通过字节码对象读取 Class getResource(“/info.txt”).getFile() 2)获取字节码对象 Class 类名.class —- 静态方法 对象.getClass() —- 实例方法

举例说明:读取web工程中资源文件 在text工程中创建四个文件 1、在text工程根目录创建 1.txt 2、在WebRoot下创建2.txt 3、在WEB-INF下创建3.txt 4、在src下创建4.txt

使用带有main函数java程序(Java Application)读取文件,可以使用相对路径和绝对路径 ,在Servlet中读取资源文件,必须使用磁盘绝对路径。

1.txt—>因为在WebRoot 外面,不会发布到tomcat服务器,无法在服务器端读取 2.txt — > getServletContext().getRealPath(“/2.txt”); 3.txt — > getServletContext().getRealPath(“/WEB-INF/3.txt”); 4.txt 位于src下,复制到WEB-INF/classes下 —> getServletContext().getRealPath(“/WEB-INF/classes/4.txt”);

通用classpath下文件读取方法 (用来加载器读取) XXX.class.getResource(“/4.txt”).getFile(); 这里/代表classpath根目录(src 、WEB-INF/classes)

代码语言:java
复制
1、java读取
    public static void main(String[] args) throws IOException {
        // 编写四个文件路径,调用readfile方法 完成文件读取
        // 读取1.txt
        String filename1 = "1.txt";
        readfile(filename1);
        // 读取2.txt
        String filename2 = "WebRoot/2.txt";
        readfile(filename2);
        // 读取3.txt
        String filename3 = "WebRoot/WEB-INF/3.txt";
        readfile(filename3);
        // 读取4.txt
        String filename4 = "src/4.txt";
        readfile(filename4);
        // 读取4.txt
        String filename5 =      FileReaderTest.class.getResource("/4.txt").getFile();
        readfile(filename5);
    }

    public static void readfile(String filename) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filename));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        bufferedReader.close();
    }
代码语言:c#
复制
2、Servlet读取
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 读取 1.txt (不会被发布到tomcat,没法读)
        // 读取 2.txt
        String filename1 = "/2.txt";
        // 根据相对于网站根目录绝对路径 ---- 获得磁盘绝对路径
        filename1 = getServletContext().getRealPath(filename1);
        System.out.println(filename1);
        readfile(filename1);
        // 读取3.txt
        String filename2 = getServletContext().getRealPath("/WEB-INF/3.txt");
        readfile(filename2);
        // 读取4.txt
        String filename3 = getServletContext().getRealPath(
                "/WEB-INF/classes/4.txt");
        readfile(filename3);
        // 读取4.txt 用类加载器读取
        String filename4 = ReadFileServlet.class.getResource("/4.txt")
                .getFile();
        readfile(filename4);
    }
    public static void readfile(String filename) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filename));
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        bufferedReader.close();
    }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/107240.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档