Servlet文档1

news2024/11/27 8:27:18

Servlet

	1、如何去书写一个servlet
	2、如何去访问一个servlet
	3、如何去快速创建一个servlet
	4、web中一些路径的访问分析
	5、servlet一些配置项(servletConfig)
	6、web项目的配置项(servletContext)

servlet简介

Servlet 是sun公司提供的一门用于开发动态web资源的技术

Server:serv

let: applet 小程序; let

Servlet 是基于Request Response编程模型
Oracle公司在其API提供了一个Servlet接口,用户若想开发一套动态的web项目,需要完成以下2步骤:
1、编写一个java类,实现servlet接口
2、把开发好的程序布署到服务器中

在这里插入图片描述

servlet:1、接受浏览器发送过来的消息。
	    2、给浏览器返回消息。浏览器认识html。可以动态去输出html

Request:请求。客户端向服务端发送的信息。C->S
Response:响应。服务器向客户端发送的信息。S-C>
通常请求和响应是成对出现的。


作用:servlet 编写一个程序生成网页。
浏览器请求servlet,servlet会生产html。把html传送给浏览器(响应)。浏览器看到内容是html

在这里插入图片描述

servlet快速入门

实现步骤

写servlet做两件事
1、创建一个类来实现servlet接口。 由ORACLe公司定义的一个接口。(定义一个规范)
2、把项目部署到web服务器中(tomcat)。

sun公司定义一个servlet的规范。定义了servlet应该有哪些方法,以及方法需要的参数。
1、实现servlet接口(javax.servlet.Servlet)

2、重写service方法
	当浏览器输入地址,访问servlet的时候,servlet会执行servcie方法。
3、在Web/WEB-INF/web.xml中配置servlet的路径 。浏览器访问servlet的路径
	web.xml

代码实现

实现servlet 接口

/**
 * @Auther: yanqi
 * @Desc 写一个普通的类,实现servlet接口即可
 */
public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("我是初始化init方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws 	ServletException, IOException {
        System.out.println("我是service方法,每一次请求都会响应");
	   //获取用户提交过来的数据
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String username = request.getParameter("username");
        System.out.println(username);

        //响应给浏览器
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        response.getWriter().println("你刚刚输入的是:"+username);
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("我是destroy方法,挂掉");

    }
}

配置请求路径

在web.xml中配置servlet的请求路径

    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--servlet的名写一定要于上面的名字保持一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet请求路径(地址)-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

访问 servlet

启动tomcat服务器,面页访问

请求路径的分析

在这里插入图片描述

servlet的生命周期

servlet 什么时候出生,什么活动,什么销毁

1、当用户第一次访问servlet时,servlet会初始化,并且只初始化一次(init)
2、每一次请求都会走service方法
3、当服务器正常关闭,servlet销毁(destroy)

服务器启动配置

    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>
        
        <!--配置servlet初始化时机,此时服务器启动时,servet就会初始化-->
        <load-on-startup>1</load-on-startup>
        
    </servlet>
    <servlet-mapping>
        <!--servlet的名写一定要于上面的名字保持一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet请求路径(地址)-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

url-pattern三种配置

1、完全路径匹配,以”/”开头 后面是具体的路径信息。
	你输入什么内容。访问的时候,就需要输入什么内容,才可以找到对应的servlet
	例如
  <url-pattern>/hello</url-pattern>

2、目录匹配,以/*结尾
   <url-pattern>/*</url-pattern>	
   http://ip:端口/abc/abx
   http://ip:端口/abc/bdsf 

3、扩展名匹配     *.扩展名     注意:  *.扩展名(正确)   /*.扩展名(错误)
	<url-pattern>*.do</url-pattern>
	<url-pattern>*.action</url-pattern>
    *.do 
	*.action

也可以三种方式:

		<url-pattern>/hello</url-pattern>
        <url-pattern>/user/*</url-pattern>
        <url-pattern>*.do</url-pattern>

servlet入门小结

	1、创建一个类,去实现javax.servlet.Serlvet 这个接口(注意包不要导错)
	2、重写类中 service方法
	3、在web-inf/web.xml 中去配置serlvet一些信息
    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--servlet的名写一定要于上面的名字保持一致-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet请求路径(地址)-->
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

快速创建servlet

实现步骤

借助开发工具可以快速的创建servlet

1、自己去定义的servlet 只需要继承HttpServlet 就可以实现 servlet的接口了。
2、以后处理用户的请求,都写在doGet或者doPost方法中。

/**
 * @Desc  1、servlet 3.0以后的版本是可以直接使用注解开发,简化了手动配置servlet请求路径
 *        2、@WebServlet( urlPatterns = "/ServletDemo")  等价于  我们在web.xml中配置
 */
@WebServlet(urlPatterns ="/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这个是post请求");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这个是get请求...");
    }
}

什么时候走get请求?
​ ----- 当指定为get请求时,浏览器默认走的get请求

什么时候走post请求?
​ ----- 指定为post请求时才会走post请求

修改servlet路径模版

当我们每一次创建完servlet之后都需要手动修改请求的路径,@WebServlet( name= “ServletDemo”)比较麻烦,
我们可以修改idea开发工具中的模版,下次再创建就不用再修改@WebServlet(urlPatterns = “/ServletDemo”)

在这里插入图片描述

web中的资源路径

如何去访问一个web中的资源

在这里插入图片描述

如果把hello.html放在WEB-INF下会发现无法直接访问。其实也可以访问,得通过后台访问,代码如下:

request.getRequestDispatcher(“WEB-INF/hello.html”).forward(request,response);

项目部署位置

我们把项目中的什么东西部署到tomcat中了?
这里是找tomcat部署的路径
C:\Users\你的用户名\.IntelliJIdeaxxx版\system\tomcat\Tomcat_8_5_33_12-servletDemo\conf\Catalina\localhost\ ROOT.xml

找到ROOT.xml中提示的路径即是项目部署的项目:
E:\Java\idea_workspase_20036\12-servletDemo\out\artifacts\12_servletDemo_war_exploded

我们发现部署是web下的所有资源:
    把项目部署到tomcat中,到底把项目中的什么东西部署到tomcat中?
    把所有web下的东西全部部署到tomcat了!!!!
    
请问src下java源代码在哪里了?
	放在WEB-INF\classes

请求路径

绝对路径

localhost:8081,后期更换IP了,会出问题。

<form action="http://localhost:8081/ServletDemo" method="post">
          
</form>

相对路径

<form action="/ServletDemo" method="post">
            
</form>

servlet配置说明

servletConfig

servletConfig 是一个对象。javaee规范中定义的一个对象。要求web服务器(tomcat),创建一个servlet的同时,也要去创建一个servletConfig对象。还要给servlet去使用。

serlvetConfig 是我们servlet 一些的配置信息。如果一个servlet 使用的过程中需要一些参数信息。这些参数信息,可以配置到servletConfig中。 之后servlet去使用。

代码实现

方式一

    <servlet>
        <!--servlet的名字-->
        <servlet-name>MyServlet</servlet-name>
        <!--servlet所在的路径-->
        <servlet-class>cn.yanqi.web.MyMVC</servlet-class>

        <!--给当前servlet配置一些参数-->
        <init-param>
            <param-name>username</param-name>
            <param-value>rose</param-value>
        </init-param>
        <init-param>
            <param-name>charset</param-name>
            <param-value>utf-8</param-value>
        </init-param>

        <!--配置servlet初始化时机-->
        <load-on-startup>1</load-on-startup>
    </servlet>
public class MyMVC implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("servlet初始化");

        //获取配置参数
        String username = servletConfig.getInitParameter("username");
        System.out.println(username);

    }
} 

方式二

initParams{@WebInitParam{},@WebInitParam{}}

在这里插入图片描述

@WebInitParam配置多个InitParam

name为InitParameter名字,value为值,之间用特殊符号隔开,这里用逗号。

@WebServlet(urlPatterns = "/ServletDemo" , initParams = {@WebInitParam(name = "charset",value = "utf-8")})
public class ServletDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        //获取ServletConfig
        ServletConfig servletConfig = this.getServletConfig();
        //获取参数
        String username = servletConfig.getInitParameter("username");
        System.out.println(username);
        */

        //获取ServletConfig
        ServletConfig servletConfig = this.getServletConfig();
        //获取参数
        String charset = servletConfig.getInitParameter("charset");
        //设置响应字符集
        //该句话一定是最上面,在中间输出有问题。
        response.setContentType("text/html;charset="+charset);
        response.getWriter().println("hello");  
    }
}

servletContext

在这里插入图片描述

ServletContext是整个web项目应用程序运行后的代表对象。(代表当前一个项目)可以通过ServletConfig的getServletContext() 的方法得到,然后可以用该对象取得整个应用程序的相关资源或者信息。

代码实现

    <!--配置全局参数,所有的servlet都可以进行访问-->
    <context-param>
        <param-name>charset</param-name>
        <param-value>utf-8</param-value>
    </context-param>
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext
        ServletContext servletContext = this.getServletContext();
        //获取参数
        String charset = servletContext.getInitParameter("charset");
        //设置响应字符集
        response.setContentType("text/html;charset="+charset);
        response.getWriter().println("我是小燕燕");
    }

两者区别

ServletConfig:
	一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
     
ServletContext:
	对任何servlet,任何人在任何时间都有效,等于是全局的对象。

getServletContext();
//获取参数
String charset = servletContext.getInitParameter(“charset”);
//设置响应字符集
response.setContentType(“text/html;charset=”+charset);
response.getWriter().println(“我是小燕燕”);
}


##  两者区别

ServletConfig:
一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问。

ServletContext:
对任何servlet,任何人在任何时间都有效,等于是全局的对象。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/742410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一次unraid中毒经历(xmrig)

起因 &#xff1a;一大早发现unraid小主机风扇狂转&#xff0c;CPU一半线程拉满 类似这样&#xff0c;只不过是左边一列所有核 执行top命令&#xff0c;发现xmrig占用 cpu 790 kill [ID] find / -name xmrig rm /bin/xmrig成功&#xff0c;CPU功耗马上下降&#xff0c;但是几…

k8s 就绪探针

【k8s 系列】k8s 学习二十&#xff0c;就绪探针 提起探针&#xff0c;不知兄dei 们是否有印象&#xff0c;之前我们分享过存活探针&#xff0c;分享存活探针是如何确保异常容器自动重启来保持应用程序的正常运行&#xff0c;感兴趣的可以查看文章 k8s 系列k8s 学习十七&#x…

揭示实时定位控件在配送小程序中的作用与价值

随着互联网技术的发展&#xff0c;配送小程序在生活中扮演着越来越重要的角色。而实时定位控件作为配送小程序中不可或缺的一部分&#xff0c;具有极大的作用与必要性。本文将以【乔拓云】第三方工具为例子&#xff0c;从商家的方面&#xff0c;对实时定位控件在配送小程序中的…

我说MySQL每张表最好不超过2000万条数据,面试官让我回去等通知?

事情是这样的 下面是我朋友的面试记录&#xff1a; 面试官&#xff1a;讲一下你实习做了什么。 朋友&#xff1a;我在实习期间做了一个存储用户操作记录的功能&#xff0c;主要是从MQ获取上游服务发送过来的用户操作信息&#xff0c;然后把这些信息存到MySQL里面&#xff0c;…

怎么在unity3D工程中导入Newtonsoft.Json

怎么在unity3D工程中导入Newtonsoft.Json unity旧版本自带的json接口太难用了&#xff08;JsonUtility&#xff09;&#xff0c;不能序列化字典和列表等对象&#xff0c;只能序列化基础类型对象&#xff0c;所以基本等于没有。 Newtonsoft.Json-for-Unity-master 的github下载…

【Linux后端服务器开发】Shell外壳——命令行解释器

目录 一、Shell外壳概述 二、描述Shell外壳原理的生动例子 三、C语言模拟实现Shell外壳 一、Shell外壳概述 在狭义上 , 我们称Linux操作系统的内核为 Linux 在广义上 , Linux发行版 Linux内核 外壳程序 就比如市面上现在的redhat, centos, ubuntu等等我们耳熟能详的Linux发…

一文教会你风格迁移CycleGAN从入门到高阶再到最终成功魔改(附成功魔改代码)

专栏导读 &#x1f525;&#x1f525;本文已收录于专栏&#xff1a;《风格迁移之从入门到成功魔改》&#xff0c;欢迎免费订阅 ​此专栏用于带你从零基础学会什么是风格迁移&#xff0c;风格迁移有什么作用&#xff0c;传统做法和Cyclegan的原理&#xff0c;及其优缺点&#x…

Docker NGINX 加载Geoip模板

前提环境&#xff1a; Docker 环境 涉及参考文档&#xff1a; ngx_http_geoip_module 模块Loki NGINX Service MeshGeoIP IP库 一、下载GeoIP IP库 二、配置Nginx主配置文件 vim /data/nginx/MangoMoh/dos/nginx.confuser nginx; worker_processes auto;error_log /var…

ncnn源码阅读(三)----数据结构Mat

文章目录 数据结构Mat成员变量成员方法构造函数1、普通构造函数2、外部数据指针构造函数3、拷贝构造函数和opertor 深拷贝函数类型转换引用计数的实现其他数据操作函数 数据结构Mat 个人认为一个框架中的比较核心的两个点&#xff0c;一个是数据结构&#xff0c;一个任务调度…

STM32F407ZGT6正点原子F4探索者开发板 -- 跑马灯例程

1. USB 转USART1 烧录工具 FlyMcu 2. FlyMcu 配置 3. 查看开发板原理图&#xff0c;LED0、LED1 硬件连接 LED0 - PF9 LED1 - PF10 PF9 0&#xff0c; LED0 亮&#xff0c;PF9 1&#xff0c;LED0 灭 PF10 0&#xff0c; LED1 亮&#xff0c;PF10 1&#xff0c;LED1 灭 4.…

cesium 实现多颗卫星与多颗地面站雷达通信效果

最主要的部分是计算空间内两点之间的距离以及卫星对地点是否在雷达扫描范围内 先看效果 1.计算空间内两点之间的距离 //计算距离 function distance(point1, point2) {var point1cartographic = Cesium.Cartographic.fromCartesian(point1);var</

医师访问学者申请需要注意什么?

医师访问学者申请是医学领域中一项重要的学术交流和合作方式。在准备申请时&#xff0c;有几个关键点需要注意&#xff0c;下面就随知识人网小编一起来看一看。 1. 目标和动机&#xff1a;明确访问学者的目标和动机&#xff0c;例如学术研究、专业发展、文化交流等。清楚表达你…

产品经理学习画原型-登录界面(交互样式设置)

经过第一阶段学习&#xff0c;目前效果如下&#xff1a; 下面我们来加入交互样式效果&#xff1a; 效果&#xff1a;

[SSM]MyBatis的缓存与逆向工程

目录 十三、MyBatis的缓存 13.1一级缓存 13.2二级缓存 13.3MyBatis集成EhCache 十四、MyBatis的逆向工程 14.1逆向工程配置与生成 14.2测试 十三、MyBatis的缓存 缓存&#xff1a;cache 缓存的作用&#xff1a;通过减少IO的方式&#xff0c;来提高程序的执行效率。 myb…

【分布式】 ELK 企业级日志分析系统 二

目录 一、FilebeatELK 部署1.1 环境部署 二、grok 正则捕获插件mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、FilebeatELK 部署 1.1 环境部署 Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.137.101 Elasticsearch Node2节点&…

【C++顺序容器】forward_list的成员函数和非成员函数

目录 forward_list 1. forward_list的成员函数 1.1 构造、析构和赋值运算符重载 1.1.1 构造函数 1.1.2 析构函数 1.1.3 赋值运算符重载 1.2 迭代器 1.3 容量 1.4 元素访问 1.4.1 遍历方法 1.5 修改器 1.6 操作 1.7 观察者 2. forward_list的非成员函数 forward_l…

npm5中本地间模块引用的最好方式(附带引用方法总结)

引用其他的包 正常情况下在项目 package.json 所在的目录&#xff08;一般也是项目根目录&#xff09;运行npm install xxxx 命令之后&#xff0c;会从远程或者代理地址下载xxxx包到node_modules&#xff0c;然后在package.json生成对应的包名和版本 如果想要依赖本地自己开发…

TypeScript 学习笔记(一):类型

文章目录 一、常见类型1. 数组2. 布尔3. 数值4. 字符串5. object6. null 和 undefined7. symbol7.1 作为属性名7.2 属性名遍历7.3 静态方法&#xff1a;Symbol.for()和 Symbol.keyFor()7.4 内置 symbol 值7.4.1 Symbol.hasInstance7.4.2 Symbol.isConcatSpreadable7.4.3 Symbol…

第四十五章Java 接口

Java 接口 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xff0c;在JAVA编程语言中是一个抽象类型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface来声明。一个类通过继承接口的方式&#xff0c;从而来继承接口的抽象方法。 接口并不是类&#x…

DevOps(二)

CD 1. 平台选择2. 技术选型3. 阶段性目标4. 搭建示例4.1 环境准备(节点机)1. java版本升级2. 编译安装git3. docker安装4. docker-compose安装5. sonarqube安装6. harbor安装7. gitlab私服 4.2 示例一&#xff08;手动&#xff09;1. 创建项目2. 编码3. Dockerfile4. 拷贝pytho…