JavaWeb -- servlet

JavaWeb ------- servlet

servlet规范介绍

  1. servlet规范来自于JAVAEE规范中的一种
  2. 作用:
    1)在servlet规范中,指定[ 动态资源文件]开发步骤
    2)在servlet规范中,指定Http服务器调用动态资源文件规则
    3)在serv1et规范中,指定Http服务器管理动态资源文件实例对象规则

Servlet接口实现类:

  1. servlet接口来自于servlet规范下一个接口,这个接口存在Http服务器提供jar包
  2. Tomcat服务器下1ib文件有一个 servlet-api.jar存放servlet接口(javax. servlet.servlet接口)
  3. Servlet规范中任务,Http服务器能调用的[动态资源文件]必须是一个servlet接口实现类

Tomcat根据Servlet规范调用Servlet接口实现类规则:

  1. Tomcat有权创建Servlet接口实现类实例对象
    Servlet oneServlet = new OneServlet();
  2. Tomcat根据实例对象调用service方法处理当前请求
    oneServlet . service()

oneServlet----------> (abstract)Ht tpServlet----->(abs tract) GenericServlet----------> servlet接口
init
destory
getServletInfo
getServletConfig

Serv1et接 口实现类开发步骤

第一步:创建一一个Java类继承与Httpservlet父类,使之成为一一个servlet接口实现类

第二步:重写HttpServlet父类两个方法。doGet或 则doPost
get
浏览器-----》oneServlet . doGet()
post
浏览器------》oneServlet. doPost ()

第三步:将servlet接口实现类信息[注册]到Tomcat服务器 [网站] —> [web] —》[WEB-INF] —>web . xm1

<!--将servlet接口实现类类路径地址交给Tomcat-->
<servlet>
	<servlet-name>mm</servlet-name>  < !--声明-一个变量存储servlet接口实现类类路径-->
	<servlet-class>com.bjpowernode.controller.oneServlet</servlet-class>
    <!--声明servlet接 -->
</ servlet>
	Tomcat
String mm = "com.bjpowernode.controller.OneServlet"
<!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
	<servlet-name> mn</ servlet- -name>
	<url-pattern>/one</url-pattern> <!--设 置简短请求别名,别名在书写时必须以"/"为开头-->
</servlet-mapping>

Servlet生命周期

  1. 网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责额创建。开发人员不能手动创建servlet接口实现类的实例对象

  2. 默认的情况下,Http服务器接收到对于当前servlet接口实现类第一次请求时
    自动创建这个servlet接口实现类的实例对象
    在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象

    <servlet>
    <servlet-name> mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径-->
    <servlet-class>com.bjpowernode.controller.OneServlet </servlet-class>
    <load-on-startup>30<load-on-startup><!--填写-一个大于0的整数即可-->
    </servlet>
    

HttpServletRespone接口

  1. 介绍:

    1. HttpServletResponse接口来自于servlet规范中,在Tomcat中 存在servlet-api. jar
    2. HttpServletResponse接口实现类由Http服务器负责提供
    3. HttpServletRe sponse接口负责将doGet/doPost方法执行结果写入到[响应体]交给浏览器
      4)开发人员习惯于将HttpServletResponse接口修饰的对象称为[ 响应对象]
  2. 主要功能:
    1)将执行结果以二进制形式写入到[响应体]

    2)设置响应头中【content-type】属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为[文字,图 片,视频,命令]

    3)设置响应头中【location】 属性,将-一个请求地址赋值给location.从而控制浏览器向指定服务器发送请求

String result ="Hello World"; / /执行结果
//--------响应对象将结果写入到响应体-------------start
//设置响应头content-type,和字符解析
	response . setContentType("Text/htmL;charset=utf-8" );
//设置响应头中【location】 属性

//1. 通过响应对象,向Tomcat索 要输出流
	PrintWriter out = response. getWriter();
//2.通过输出流,将执行结果以二进制形式写入到响应体
	out.write(result) ; 
//使用print向浏览器输入
	out.print(result);
//-----响应对象将结果写入到响应体--------------start

/*
	浏览器在接收到响应包之后,如果
	发现响应头中存在Location属性
	自动通过地址栏向location指定网站发送请求
	
	sendRedirect方法远程控制浏览器请求行为[请求地址,请求方式,请求参数]
**/


String result1 ="http:/www.baidu.com" ;
//通过响应对象,将地址赋值给响应头中Location属性
response . sendRedirect(result1);// [响应头location="http:/ /www . baidu. com" ]

HttpServletRequest接口

  1. 介绍:
    1. HttpservletRequest接口来自于servlet规范中,在Tomcat中存 在servlet-api. jar
    2. HttpServletRequest接口实现类由Http服务器负责提供
    3. HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
      4)开发人员习惯于将HttpservletRequest接口修饰的对象称为【请求对象
  2. 作用:
    1)可以读取Http请求协议包中【请求行】信息
    2)可以读取保存在Hitp请求协议包中【请求头】或则【请求体】中请求参数信息
    3)可以代替浏览器向Http服务器申请资源文件调用|
//1.通过请求对象,读取[请求行]中[urL]信息
string urL = request. getRequestURL () . toString();
//2.通过请求对象,读取[请求行]中[method]信息
String method = request.getMethod() ;
//3.通过请求对象,读取[请求行] 中uri信息
/*
URI:资源文件精准定位地址,在请求行并没有URI这个属性。
实际上URL中截取一个字符串,这个字符串格式" /网站名/资源文件名”
URI用于让Http服务器对被访问的资源文件进行定位
**/
String uri = request.getRequestURI();// substring 

//4,通过请求对象,读取[请求体]参数信息 
request.getParameter("userName ");
/*
问题:
	以GET方式发送中文参数内容"老杨是正经人"时,得到正常结果
	以POST方式发送中文参数内容"老崔是个男人",得到[乱码] "e????????????.???"
原因:
	浏览器以GET方式发送请求,请求参数保存在[请求头] ,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求头二进制内容由Tomcat负责解码,Tomcat9. 0默认使用[utf-8]字符集,可以解释一切国家文字
	浏览器以POST方式发送请求,请求参数保存在[请求体] ,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求体二进制内容由当前请求对象(request)负责解码。request默认使用[IS0-8859-1]字符集,一个东欧语系字符集此时如果请求体参数内容是中文,将无法解码只能得到乱码
解决方法:
	//通知请求对象,使用utf- 8字符集对请求体二进制内容进行一次重写解码
	request. setCharacterEncoding("utf-8");

**/

请求对象与响应对象的生命周期

1.在Http服务器接收到浏览器发送的[Http请求协议包]之后,自动为当前的[Http请求协议包]生成一一个[请求对象]和一个[响应对象]
2.在Http服务器调用doGet/doPost方法时,负责将[ 请求对象]和[响应对象]作为实参传递到方法,确保doGet/ doPost正确执行
3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的[请求对象]和[响应对象]
销毁

[请求对象]和[响应对象]生命周期贯穿一次请求的处理过程中

[请求对象]和[响应对象]相当于用户在服务端的代言人

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N0ulFMCY-1645601666961)(C:\Users\无敌维\AppData\Roaming\Typora\typora-user-images\1645595879290.png)]

servlet在开发中的其他问题

欢迎资源文件

1.前提:
用户可以记住网站名,但是不会记住网站资源文件名
2.默认欢迎资源文件:
用户发送了-一个针对某个网站的[默认请求]时,此时由Http服务器自动从当前网站返回的资源文件
正常请求: http: //localhost: 8080/myWeb/index . html
默认请求: http://localhost: 8080/myweb/
3.Tomcat对于默认欢迎资源文件定位规则
1)规则位置:Tomcat安装位置/conf/web.xm1

​ 2)规则命令:.

<welcome-file-list>
	<welcome-file> index.html </welcome- file>
	<welcome-file>index.html</welcome- file>
	<welcome-fi1e>index.jsp</welcome- file>
</welcome-file-list>

4.设置当前网站的默认欢迎资源文件规则
1)规则位置:网站/web/WEB-INE/web . xml
2)规则命令

<welcome-file-list>
	<welcome-file>login.html</welcome-file>
    <welcome-file>user/find</welcome-file>< !--servLet作为默认欢迎资源时,开头斜线必须抹掉-->
</welcome-file-list>
<!-- 网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效 -->

多个Servlet之间的调用规则

  1. 前提条件:
    某些来自于浏览器发送请求,往往需要服务端中多个servlet协同处理。
    但是浏览器一次只能访问一一个servlet,导致用户需要手动通过浏览器
    发起多次请求才能得到服务。
    这样增加用户获得服务难度,导致用户放弃访问当前网站[98k,ARM]
  2. 提高用户使用感受规则:
    无论本次请求涉及到多少个servlet,用户只需要[手动]通知浏览器发起
    一次请求即可I
  3. 多个servlet之间调用规则:
    1)重定向解决方案
    2)请求转发解决|
重定向解决方案
  1. 工作原理:用户第一次通过[手动方式]通知浏览器访问oneServlet.
    Oneservlet工作完毕后,将TwoServlet地址写 入到响应头
    location属性中
    ,导致Tomcat将302状态码写入到状态行。
    在浏览器接收到响应包之后,会读取到302状态。此时浏览器
    自动根据响应头中location属性地址发起第二次请求,访问
    TwoServlet去完成请求中剩余任务

  2. 实现命令:
    response . sendRedirect (“请求地址”)
    将地址写入到响应包中响应头中location属性

  3. 特征:
    1)请求地址:
    既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)
    也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名)

     2)请求次数
     浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。
     后续请求都是浏览器自动发送的。
    

    3)请求方式:
    重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
    通过重定向解决方案调用的资源文件接收的请求方式一定是[GET]

  4. 缺点: .
    重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
    消耗在往返次数上,增加用户等待服务时间

请求转发解决
  1. 原理:
    用户第一次通过手动方式要求浏览器访问oneServlet。
    OneServlet工作完毕后,通过当前的请求对象代替浏览器
    向Tomcat发送请求,申请调用TwoServlet。
    Tomcat在接收到这个请求之后,自 动调用TwoServlet来
    完成剩余任务

  2. 实现命令:请求对象代替浏览器向Tomcat发送请求
    //1.通过当前请求对象生成资源文件申请报告对象
    RequestDispatcher report = request . getReques tDispatcher("/资源文件名")
    //2.将报告对象发送给Tomcat
    report .forward(当前请求对象,当前响应对象)|

  3. 优点:
    1)无论本次请求涉及到多少个servlet,用户只需要手动通过浏览器发送一次请求
    2)Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
    增加处理服务速度

  4. 特征:
    1)请求次数
    在请求转发过程中,浏览器只发送一次请求
    2)请求地址
    只能向Tomcat服务器申请调用当前网站下资源文件地址
    request. getRequestDispathcer("/资源文件名") 不要写网站名

    ​ 3)请求方式
    ​ 在请求转发过程中,浏览器只发送-一个 了个Http请求协议包。
    ​ 参与本次请求的所有Servlet共享同一一个请求协议包,因此
    ​ 这些servlet接收的请求方式与浏览器发送的请求方式保持一致

多个servlet之间数据共享实现方案

  1. 数据共享: OneServlet 工作完毕后,将产生数据交给TwoServlet来使用

  2. Servlet规范中提供四种数据共享方案

    1. ServletContext接口【全局作用域对象】
    2. Cookie类
    3. HttpSession接口【会话作用域对象】
    4. HttpServletRequest接口【请求作用域对象】
ServletContext接口

介绍:Tomcat提供接口实现类,通过网站的servletcontext来实现数据共享

工作原理:相当于一个网站中的Map集合

生命周期: 在服务器启动时自动创建,服务器运行期间只有一个servletcontext对象,服务器关闭时进行销毁(贯穿整个网站的运行期间)

代码

        //通过request获取全局对象
        ServletContext application = request.getServletContext();
        //向全局作用域对象中存入数据
        application.setAttribute("key","value");
		//获取数据
		application.getAttribute("key");
Cookie类

介绍:Tomcat提供接口实现类,通过同一用户浏览器Cookie对象来实现数据共享

工作原理:存储在本地浏览器中

生命周期: 默认情况下cookie对象是存在浏览器的缓冲当中,因此浏览器对象一关就销毁了

在手动设置下,可以使浏览器的cookie存放在硬盘中,并指定存放时间:setMaxAge(60),单位为秒

代码

		//存放
        Cookie cookie = new Cookie("a","b");
        response.addCookie(cookie);

        //取出
        Cookie cook[] = request.getCookies();
        for(Cookie c: cook){
            String key = c.getName();
            String value = c.getValue();
        }
HttpSession接口

java代码

//写
       HttpSession session = request.getSession();
       session.setAttribute("a","b");
//读取session
        session.getAttribute("a");

HttpSession销毁时机:

  1. 用户与HttpSession关联时使用的cookie只能存放在浏览器缓存中.

  2. 在浏览器关闭时,意味着用户与他的HttpSession关系被切断

  3. 由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会
    导致Tomcat将浏览器关联的HttpSession进行销毁

  4. 为了解决这个问题,Tomcat为每一 -个HttpSession对象设置[空闲时间]
    这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟
    此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就 会销毁
    掉这个HttpSession|

Cookie和session的区别

​ 1)存储位置:—个在天上,-一个在地下
​ cookie:存放在客户端计算机(浏览器内存/硬盘)
​ HttpSession:存放在服务端计算机内存
​ 2)数据类型:
​ cookie对象存储共享数据类型只能是string
​ HttpSession对象可以存储任意类型的共享数据object
​ 3)数据数量:
​ -一个Cookie对象只能存储–个共享数据I
​ HttpSession使用map集合存储共享数据,所以可以
​ 存储任意数量共享数据
​ 4)参照物:
​ cookie相当于客户在服务端[会员卡]
​ HttpSession相当于客户在服务端[私人保险柜|]

HttpServletRequest接口
 request.setAttribute("info","试题添加成功");

 request.getAttribute("info");

监听器

过滤器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值