Java系列课程第四十三天 (JavaWEB-JSP)

这篇博客详细讲解了JavaWEB中的JSP,包括Servlet的Response对象,重定向和转发的区别,以及AJAX交互。讨论了HttpServletResponse的功能,如设置响应行、状态码和响应头,并探讨了sendRedirect与forward的区别。此外,还介绍了ServletContext的用途和生命周期,以及JSP的九个内置对象和它们的作用,特别是Request、Response、Session和Application。最后,讨论了JSP实现跳转的两种方式——重定向和转发,及其应用场景和区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day43 JavaWEB-JSP

  1. Servlet
    1.1 Response

  2. Http中响应消息格式
    *格式:
    HTTP/1.1 200 OK
    Content-Type: text/html;charset=UTF-8
    Content-Length: 101
    Date: Wed, 06 Jun 2018 07:08:42 GMT
    (空行)


    <span class="katex--inline">Title</span>


    hello , response

     1) 响应行
     	1. 组成:协议/版本 响应状态码 状态码描述
     	2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
     		1. 状态码都是3位数字 
     		2. 分类:
     			1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
     			2xx:成功。代表:200
     			3xx:重定向。代表:302(重定向),304(访问缓存)
     			4xx:客户端错误。
     				* 代表:
     					* 404(请求路径没有对应的资源) 
     					* 405:请求方式没有对应的doXxx方法
     			5xx:服务器端错误。代表:500(服务器内部出现异常)
     			
     2) 响应头:
     	1. 格式:头名称: 值
     	2. 常见的响应头:
     		1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
     		2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
     			* 值:
     				* in-line:默认值,在当前页面内打开
     				* attachment;filename=xxx:以附件形式打开响应体。文件下载
     	3) 响应空行
     	4) 响应体:传输的数据 
    
  3. Response对象
    HttpServletResponse继承ServletResponse接口,专门封装HTTP响应消息

  4. Response功能

    1. 设置响应行
      1. 格式:HTTP/1.1 200 ok
      2. 设置状态码:setStatus(int sc)
    2. 设置响应头:setHeader(String name, String value)
    3. 设置响应体:
      • 使用步骤:
        1. 获取输出流
          • 字符输出流:PrintWriter getWriter()
          • 字节输出流:ServletOutputStream getOutputStream()
        2. 使用输出流,将数据输出到客户端浏览器
          response.getWriter().println(“xxxx”);
          4)设置编码
          response.setContentType(“text/html;charset=utf-8”);
    4. 简单的重定向方法
      response.sendRedirect("/day15/responseDemo2");
      • 重定向的特点:redirect
        1. 地址栏发生变化
        2. 重定向可以访问其他站点(服务器)的资源
        3. 重定向是两次请求。不能使用request对象来共享数据
          *forward 和 redirect 区别
          Forward是服务器内部跳转,两个页面中数据互通,使用同一个request对象,但是地址栏中依然显示第一次请求的url地址,用户感觉不到页面进行了跳转,也只会发送一次请求。
          在这里插入图片描述
          sendRedirect是重定向,两个页面数据不互通,使用的不是同一个request对象,地址栏中显示的是第二个请求的url地址,会发送两次请求
          在这里插入图片描述
          重定向的特点:redirect
    1. 地址栏发生变化
    2. 重定向可以访问其他站点(服务器)的资源
    3. 重定向是两次请求。不能使用request对象来共享数据
      转发的特点:forward
    4. 转发地址栏路径不变
    5. 转发只能访问当前服务器下的资源
    6. 转发是一次请求,可以使用request对象来共享数据

1.2 ajax交互
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.2 ServletContext

  1. 概念
    代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取
    1. 通过request对象获取 request.getServletContext();
    2. 通过HttpServlet获取 this.getServletContext();
  3. 功能
    1. 获取MIME类型:

      • MIME类型:在互联网通信过程中定义的一种文件数据类型

      • 格式: 大类型/小类型 text/html image/jpeg

      • 获取:String getMimeType(String file)

    2. 域对象:共享数据

      1. setAttribute(String name,Object value)
      2. getAttribute(String name)
      3. removeAttribute(String name)
      • ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径

      1. 方法:String getRealPath(String path)
        String b = context.getRealPath("/b.txt");//web目录下资源访问 System.out.println(b);

      String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问 System.out.println©;

      String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问 System.out.println(a);

1.2 作用域
getAttribute
setAttribute
removeAttribute
以上三个方式,是request和session 以及servletContext都有的,用来向对应的作用域中保存数据,获取数据,删除数据

1.2.1 request
当前请求有效,如果向request中保存数据,那么仅在当前请求中可以获取
一般用于页面和后端交互时使用

在这里插入图片描述
一直都是0 因为 request当前请求有效

1.2.2 session
当前会话有效,建立的持续通信,一般是浏览器打开到浏览器关闭时一次会话,只不过也可以设置时间
一般用来保存登陆信息

在这里插入图片描述
同会话中,数据共享
1.2.3 servletContext
全局有效
在这里插入图片描述
只要tomcat不重启,数据就一直在

1.3 HttpServlet底层原理
通过生命周期测试,大家发现,真正的Servlet接口中,并没有doGet()和doPost()方法
那么第一个程序中doGet()/doPost()为什么可以执行?
这个问题就发生在HttpServlet类中
HttpServlet中覆写了Servlet中的方法service()方法,并重载添加了一个service()方法,该方法参数为HttpServletRequest和HttpServletResponse
并在原生service()方法中对重载的方法进行调用,然后在重载的service()方法中,根据请求的方式(get/post)去调用doGet()或doPost()方法
所以就把doGet/doPost加入到了Servlet的生命周期中
在技术手册中也有很明白的解释
在这里插入图片描述
所以会有这样一个说法,就是service()方法优先级比doGet()和doPost()优先级高,如果servlet中同时覆写了service/doGet/doPost三个方法,那么只会执行service
额…这个也可以这样说吧,毕竟他们不是优先级的问题,如果我们覆写了service(),那么再多态执行的时候便不会去执行父类的方法,所以也就不会再对doGet/doPost方法进行调用的
那么下面我们就简单模拟一下HttpServlet的实现

1.4 初始化数据
我们可以在web.xml中准备servlet需要用到的数据
有两种方式,一种是数据只能让某一个servlet使用,需要通过ServletConfig对象获取
Web.xml设置 :

_07_InitParam
com.tledu.zrz.servlet._07_InitParam


name
张三

Java中获取 :
servletConfig.getInitParameter(“name”);

另一种是数据可以让所有的serlvet使用,需要通过ServletContext对象获取
Web.xml设置 :

password
root

Java中获取 :
servletConfig.getServletContext().getInitParameter(“password”);

  1. JSP
    2.1 jsp解决了什么问题
    Servlet中,要想将数据等内容打印到客户端页面中,需要在java代码中拼接大量的html代码,非常的不合理。
    Jsp就是解决这个问题。只需要把数据交给jsp,由jsp来完成数据的展示工作。
    2.2 简介
    JSP—Java Server Pages
    拥有servlet的特性与优点(本身就是一个servlet)
    直接在HTML中内嵌JSP代码
    JSP程序由JSP 引擎先将它转换成Servlet代码,接着将它编译成类文件载入执行
    只有当客户端第一次请求JSP时,才需要将其转换、编译
    在这里插入图片描述
    优点:
    优良的性能
    优于CGI,PHP,ASP
    平台无关性
    操作系统无关,Web服务器无关
    可扩展性
    tag的扩展机制,简化页面开发

2.3 简单语法
<%! %> 表示servlet的类体
<% %> 表示service()方法体
<%= %> 表示 println(); 用于向页面输出内容
<%@ pager %> 指令,比如导包,嵌套页面等
常用属性
contentType 设置类型和字符编码
contentType=”text/html;charset=UTF-8”
errorPage 定义错误页面,出错的时候发生跳转
errorPage=”xxxx.jsp” 被跳转的页面需要设置isErrorPage属性
isErrorPage 可以设置true/false,表示此页面是否为错误页面

Import 导包, import=”java.util.*”
Language 定义脚本语言,目前只能用java
pageEncoding 设置字符编码 pageEncoding=”UTF-8”

<%@include file=“fileURL%> 静态包含其他页面,两个页面合并为一个页面,只生成一个class文件
与之类似的还有<jsp:include page=“fileURL” flush=“true”> 动态包含,两个页面生成两个class , 动态调用
*(flush属性,默认为 false,设置为true时,服务器端会做页面缓冲。服务器在解释jsp文件时是一步一步进行的,默认不做缓冲时,解释生成一句html就会发送给客户端一句,做了缓冲后,会一部分一部分的发送,缩短客户端延迟,避免数据泄露造成错误)
<%@ taglib %> 导入别的扩展包,比如 JSTL

2.4 九大内置对象
内置对象,在jsp中默认内置好的java对象,可以直接使用。在servlet中,一些对象,需要我们手动创建对象,并不能直接使用,比如说session对象。那在jsp中,如何使用session等对象呢。直接用即可。这也是为什么叫内置对象。
变量名 真实类型 作用

  • pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
  • request HttpServletRequest 一次请求访问的多个资源(转发)
  • session HttpSession 一次会话的多个请求间
  • application ServletContext 所有用户间共享数据
  • response HttpServletResponse 响应对象
  • page Object 当前页面(Servlet)的对象this
  • out JspWriter 输出对象,数据输出到页面上
  • config ServletConfig Servlet的配置对象
  • exception Throwable 异常对象

Out : 内置对象是一个缓冲的输出流,用来给客户端返回信息。它是javax.servlet.jsp.JspWriter的一个实例
用于向页面输出内容
常用方法
println():向客户端输出各种类型数据
newLine():输出一个换行符
jsp的newLine()函数只是在组装html代码的时候对html的源代码进行了换行
close():关闭输出流

out.clear()是直接清空缓冲区数据,不输出到客户端且刷新缓存时抛出异常
out.flush()先输出缓冲区数据再清空
out.clearBuffer() 清空缓冲区,不输出到客户端
*缓冲问题:
在这里插入图片描述
分析:如果按没有jsp缓存和servlet缓存的话,输出的结果应该是abc,但是输出的却是bac,为什么呢?按照我们上面所说的原理进行分析,out对象是先将其输出到JSP缓存中,所以a加入了jsp缓存,response.getWriter().print(“b”)是直接将b输出到servlet缓存中,然后又使用out对象将c输出到jsp缓存,到程序结束,servlet缓存中有b,然后jsp会将缓存中的内容就刷新到servlet缓存中,serlvet就是bac了,然后到浏览器也就得到我们的输出结果了。如果将out.flush()注释去掉,答案就是abc。原因是我们手动的将jsp缓存里面的数据刷新到servlet缓存里面了。

Request :内置对象表示的是调用JSP页面的请求。通常,request对象是javax.servlet.http.HttpServletRequest接口的一个实例

常用方法
getMethod():返回客户端向服务器端传送数据的方法
getParameter(String paramName):返回客户端向服务器端传送的参数值,该参数由paramName指定
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举类型数据(Enumeration)
getParameterValues(String name):获得指定参数的所有值,由name指定
getRequestURI():获得发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端机器名称
getServerName():获取服务器的名字
getServletName():客户端所请求的脚本文件路径
getServerPort():获取服务器端的端口
getContextPath() 获取当前项目名 /xxx

Response : 表示的是返回给客户端的响应
是javax.servlet.http.HttpServletResponse接口的一个实例
经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP 重定向和编码URL
常用方法:
addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定的信息
addHeader(String name,String value):添加HTTP头信息,该Header信息将发送到客户端
containsHeader(String name):判断指定名字的HTTP文件头是否存在
sendError(int):向客户端发送错误的信息
sendRedirect(String url):重定向JSP文件
和jsp:forward的区别
sendRedirect通过客户端发起二次申请,不同的request对象
Jsp:forward是同一个request,在服务器内部转发
setContentType(String contentType):设置MIME类型与编码方式

session和application
<% @page session=“true”%>–表示session功能已经在jsp页面中启动,一次会话
session常用方法:
void setAttribute(String name,Object value)
Object getAttribute(String name)
boolean isNew() 判断是否是新建的session
application
就是ServletContext,全局作用域

Exception : 异常对象,如果有什么异常信息,页面可以使用exception直接获取

config : ServletConfig 配置对象

pager : Object pager = this , 也是域,代表当前页面有效
可以参考运行jsp之后生成的java文件,在TomCat的work下,所谓内置对象,其实就是在生成的Servlet中service()方法中的局部变量
2.5 jsp实现跳转方式
跳转我们经常用到,不管是页面之间跳转还是页面跳转到java后台,还是在java后台跳转到对应的页面,都经常用到
而跳转方式又被分为两种,Forward和 sendRedirect
Jsp写法
重定向跳转
<%
response.sendRedirect("_06_page.jsp");
后面的代码依旧会执行,和跳转页面用的是同一个request对象
会请求两次,并且地址栏会变成跳转的页面的地址
如果 对页面传值 比如 A.jsp?name=222 在 被跳转页面 request.getParameter 是获取不到数据的
同理 调用request.setAttribute(“aa”, 11); 方法设置的值,在被跳转页面 依然获取不到
因为 是两次请求,两个request对象,数据不互通
%>
Forward跳转
<jsp:forward page="/xxx" />
后面代码不会执行,并且和跳转页面不是同一个request对象
只会请求一次,并且地址栏不变

通过地址栏传递值 A.jsp?name=222 在 被跳转页面 request.getParameter 可以获取数据
同理 调用request.setAttribute(“aa”, 11); 方法设置的值,在被跳转页面 依然能获取到数据
因为 是1次请求,1个request对象,数据互通
总结 : response.sendRedirect 和jsp:forward的区别
1 前者后面代码会执行,后者不会执行
2 前者地址栏会发生变化,显示被跳转页面的路径,后者不变,依旧是请求的页面地址
3 前者是两个request对象,数据不互通,后者是1个对象,数据互通
4 前者需要客户端往返,后者直接在服务器内部跳转

Java写法
sendRedirect :
response.sendRedirect( request.getContextPath() + “/xxx.jsp” );
这里 / 默认定位到 webapps 下,也就是服务器根目录,所需 需要加上项目名进行访问
如果不加 / 就是相对路径,相当于请求的上级
比如 是请求 a/b 到的这个servlet 那么如果直接写 response.sendRedirect(“c.jsp” );
就会去找 a/c.jsp
运行地址 127.0.0.1:8080/JSP_01/sTj
Forward:
this.getServletConfig().getServletContext()
.getRequestDispatcher("/xxx").forward(request, response);
必须加 / ,代表项目根目录(webroot)
并且 跳转后面的代码,会执行,jsp的不会执行,是因为生成servlet的时候,自动加了return,
运行地址 127.0.0.1:8080/JSP_01/sTjf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值