J2EE JSP 基础知识总结

2023-05-16

  • Tomcat 9
  • Java Server Page(Java 服务页)

一:JSP 初识

使用 JSP 文件

JSP 是 HTML 文件与 Java 文件的混合文件,HTML 文件可以直接通过浏览器打开,Java 文件使用Java虚拟机进行编译。

JSP 文件需要借助第三方(比如:Tomcat)编译 -> .java -> 执行 -> .class -> 信息传给浏览器,最后通过浏览器展示。

JSP 文件的创建

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
	<body>
		<%
			此处书写Java代码,尖括号外书写HTML代码
		%>
	</body>
</html>
  • <%@ page 属性=值 %> 头信息标签,说明当前JSP的一些内容
    • contentType="text/html;charset=UTF-8" 说明当前JSP里面拼接好的相应信息浏览器该如何解析
    • language="java" 说明当前JSP中可以包含的语言
    • pageEncoding="UTF-8" 告知服务容器(比如:Tomcat)以这种字符集进行编译,如果不写就遵循 contentType 中所写的 charset
  • <% %> 标签内书写 Java 代码,该标签可以出现在任意位置

JSP中的不同<%%>形式的标签(代码标签)

  • <%@ %> 做说明 通常放在头部
  • <%! %> 生成的代码存在 xxx_jsp.java 类中,作为成员存在,通常用来定义属性与方法
  • <% %> 生成的代码存在 xxx_jsp.java 类中的 _jspService() 方法内部,通常是写逻辑
  • <%= %> 生成的代码存在 xxx_jsp.java 类中的 _jspService() 方法内部,通常用来赋值或者打印输出

二:JSP 九个内置对象

内置对象放置在 JSP 生成的 .java 代码中的 _jspService 方法内部

  • HttpServletRequest request 一次请求
  • HttpServletResponse response 客户端响应信息
  • HttpSession session 一次会话
  • ServletContext application 全局对象上下文
  • JSPWriter out 输出对象
  • Object page 当前页对象(比如:xxx.jsp 文件对应的 xxx_jsp.java 文件)
  • PageContext pageContext 页面对象上下文
  • ServletConfig config 读取信息对象
  • Exception exception 异常对象

(1)HttpServletRequest request

  • 用来获取请求携带的参数信息
String = request.getParameter("key");
  • 用来设置接受请求参数时的字符集(比如:UTF-8)
request.setCharacterEncoding("UTF-8");
  • 存储某一个自己产生的数据;获取之前一次请求中request对象存储的数据
request.setAttribute("key", Object);
Object = request.getAttribute("key");
  • 用来设置转发的资源路径;转发
RequestDispatcher rd = request.getRequestDispatcher("path");
rd.forward(request, response);//真正的转发
  • 获取请求携带参数全部的 key
Enumeration = request.getParameterNames();
  • 获取 key 一致的一组 value 值,通常用作复选框
String[] = request.getParameterValues("key");
  • 统一资源定位器(Uniform Resource Locator);统一资源标识符(Uniform Resource Identifier)
StringBuffer = request.getRequestURL();// http://ip:port/工程名/资源名

String = request.getRequestURI(); // /工程名/资源名
  • 获取协议头传递的信息
request.getHeader("Host"); // localhost:8080
request.getHeader("Accept-Language"); // zh-CN,zh;q=0.9

Enumeration = request.getHeaderNames(); // 获取全部的 key

协议头信息 举例:

GET    /index.jsp     HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Webstorm-2f8f75da=1b88d886-30e2-4089-abc9-af9030089775

借助 request.getHeader("Accept-Language"); 可以实现国际化:通过获取浏览器首选语言,决定页面展示语言(后端进行处理)

  • 获取 session;获取 cookies
HttpSession = request.getSession();

Cookie[] = request.getCookies();

(2)HttpServletResponse response

  • 设置字符集(比如:UTF-8)
response.setCharacterEncoding("UTF-8");
  • 将响应信息写回浏览器
PrintWriter pw = response.getWriter();
pw.write("");

这个方法并不常用,并且相同功能可以由内置对象 JSPWriterout.write(); 实现

  • 获取状态响应码;设置状态响应码
int = response.getStatus();

response.setStatus(int);
  • Cookie 写回浏览器
response.addCookie(Cookie);

Cookie 是在客户端(浏览器端)存储的一个记录

new Cookie("key", "value"); key 不可以为 null 且字符串长度不能为零

  • 请求重定向
response.sendRedirect(String);

转发和重定向的区别:

请求转发请求重定向
RequestDispatcher 类HttpServletResponse 类
request.getRequestDispatcher("path").forward(request, response)response.sendRedirect("path");
转发是在服务器内部完成,服务器内部传递 req resp,是一次请求重定向是服务器告知浏览器,让浏览器重新再发一个请求,服务器需要解析新的请求,获得新的req resp,是两次请求
转发的时候浏览器URL不会改变重定向的时候浏览器的URL会发生改变
转发只能在当前服务器的当前工程内部重定向可以发送给新的服务器或新的工程

(3)HttpSession session

  • Session 属性的增删改查
session.setAttribute("key", Object); // 增 或 改

Object = session.getAttribute("key"); // 查

session.removeAttribute("key"); // 删

Enumeration = session.getAttributeNames(); // 获取全部的key
  • Session 设置最大的不活跃时间,默认值为 1800秒==30分钟(即浏览器与服务器连接过程中,30分钟没有交互,则 Session 进入不活跃状态,无法使用)
session.setMaxInactiveInterval(int); // 单位是秒
  • Session 失效(销毁 Session 对象)
session.invalidate();
  • Session 获取 id
String = session.getId();

(4)ServletContext application

全局上下文对象 作用域是所有 Servlet 对象(包括 JSP 文件生成的 Java 文件)

  • application 属性的增删改查
ServletContext = application.setAttribute("key", Object); // 增 或 改

Object = application.getAttribute("key"); // 查

application.removeAttributer("key"); // 删

Enumeration = application.getAttributeNames(); // 获取全部的key
  • application 获取 Servlet 对象加载时携带的信息

所有 Servlet 对象共用的信息为 application,web.xml 文件“根标签”下进行如下配置:

<context-param>
    <param-name>key1</param-name>
    <param-value>value1</param-value>
</context-param>

<context-param>
    <param-name>key2</param-name>
    <param-value>value2</param-value>
</context-param>

...

获取作用于所有 Servlet 对象的信息

String = application.getInitParameter("key1"); // value1

Enumeration = application.getInitParameterNames();
  • 获取项目部署后文件的路径(web项目部署后文件路径一般会变化)
String = application.getRealPath("文件路径");

补充三个与路径相关的方法:

StringBuffer = request.getRequestURL();// http://ip:port/工程名/资源名

String = request.getRequestURI(); // /工程名/资源名

// 这个方法非常好用
InputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("文件路径");

(5)四个作用域对象

作用域对象范围
PageContext pageContext只有在当前页作用域中可以访问(xx_jsp.java当前这个类的范围内)
HttpServletRequest request一次请求的范围之内
HttpSession session一次会话的范围内(同一个"人"的多次请求 )
ServletContext application全局范围之内(多个session共享)

以上四个作用域对象都有四个操作属性的增删改查方法

(6)ServletConfig config

读取配置文件中某个Servlet携带的信息

String = config.getInitParameter("key"); 

Enumeration = config.getInitParameterNames(); 

String = config.getServletName();

ServletContext application = config.getServletContext();

(7)Exception exception

500 是服务器运行错误,服务器若不做处理则部分源代码会暴露给用户

需要设置一个专门反馈错误的 jsp 文件:

  1. 假设创建 error.jsp 文件,需要在头信息标签中添加一组属性值:
<%@ page isErrorPage="true" %>
  1. 其余 JSP 文件的头信息标签中添加另一组属性值:
<%@ page errorPage="error.jsp" %>
  1. 假若其余 JSP 文件出现异常,信息将会转发给 error.jsp 文件处理,然后响应给浏览器

三:JSP 指令标签

通常放置在 JSP 头部,做说明性质的描述

(1)<%@ page %>

  • 属性值的作用:
属性值作用
contentType="text/html;charset=UTF-8"告知浏览器解析时遵循的字符规则
language="java"告知 JSP 中含有的语言(默认为Java)
pageEncoding="UTF-8"告知 Tomcat 解析 JSP 时遵循的字符规则
import=""在JSP中导入的 Java 文件的包
isErrorPage="true"设置当前 JSP 作为一个异常页
errorPage="xxx.jsp"转发到异常页
  • Tomcat 将 JSP 解析成 Java 文件时遵循的字符规则优先级:pageEncoding > charset > Tomcat 字符集
  • 浏览器解析响应信息遵循的字符规则优先级:charset > pageEncoding > 浏览器字符集

(2)<%@ taglib %>

JSTL(Jsp Standard Tag Library,JSP 标准标签库)

例如:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

两个属性分别是资源路径、前缀

(3)<%@ include %>

在当前 JSP 中引入已经写好的资源

该标签只有一个属性 file="jsp文件或者html文件路径"

  • include 标签引入一个 JSP 资源正常(不会出现中文乱码的问题,脚本也同时好用)
  • include 标签引入一个 HTML 资源(会产生中文乱码,即便是设置了 charset 也不好用)
    • HTML 是解释性语言,JSP 引入 HTML 时会按照平台字符集(一般为GBK)解析后拿过来展示在浏览器上(其实就是 JSP 头标签对字符编码的设置无法影响引入的 HTML 资源)
    • 解决上述 HTML 乱码问题需要配置 web.xml 文件,根标签下进行如下配置即可
<jsp-config>
	<jsp-property-group>
		<url-pattern>*.html</url-pattern>
		<page-encoding>UTF-8</page-encoding>
	</jsp-property-group>
</jsp-config>
  • 扩展介绍(看下方代码),jsp-property-group 标签下子标签是有顺序的
  • description 标签是介绍,display-name 组名,其余标签显示的是默认值
<jsp-config>

	<jsp-property-group>
		<description>JSPConfiguration</description> <!--介绍-->
		<display-name>JSPConfiguration</display-name> <!--组名-->
		<url-pattern>*.jsp</url-pattern>
		<el-ignored>false</el-ignored> <!--el表达式有效-->
		<page-encoding>UTF-8</page-encoding>
		<scripting-invalid>false</scripting-invalid> <!--脚本有效-->
	</jsp-property-group>
	
	<jsp-property-group>
		<description>HTMLConfiguration</description>
		<display-name>HTMLConfiguration</display-name>
		<url-pattern>*.html</url-pattern>
		<el-ignored>false</el-ignored>
		<page-encoding>UTF-8</page-encoding>
		<scripting-invalid>false</scripting-invalid>
	</jsp-property-group>
	
</jsp-config>

四:JSP 动作标签

用来替代 JSP 中 java 的一些操作(创建对象、对象的赋值取值、请求转发…),只是技术演变过程中的一个临时产物

技术演变

  1. 技术最早是 ModelOne 模式
    • 只有 Servlet
    • 并且是 M + VC 模式(MVC 模式中 VC 杂糅在一起,拼接响应信息 V 很麻烦)
  2. 技术小革新 ModelTwo 模式
    • Servlet + JSP
    • MVC 模式中 VC 区分开(Servlet 处理 C,JSP 处理 V)
  3. JSP 技术出现以后,写法比较简单、更像是一个文件资源,而且这个文件中还能直接写 Java 程序
    • 除了使用 JSP 实现 V,还使用 JSP 实现 M(因为 JSP 本质上是 Servlet)
    • 运行性能存在问题:不安全、管理不方便
    • JSP2.0 出现动作标签
  4. JSP 展示时会出现一些逻辑问题
    • 所有 JSP 的标签风格不统一
    • 出现两个新技术:EL(Expression Language) + JSTL(Jsp Standard Tag Library)
  5. 新的模板语言产生

JSP 六个动作标签

<jsp:xxx>

(1)创建对象

<jsp:useBean id="" class="" scope=""></jsp:useBean>

(2)对象的属性赋值

<jsp:setProperty name="" property="" value=""></jsp:setProperty>

或者(前者取固定值,后者取传过来的值)

<jsp:setProperty name="" property="" param=""></jsp:setProperty>

(3)对象的属性取值

<jsp:getProperty name="" property=""></jsp:getProperty>

(4)、(5)请求转发

<jsp:forward page=""></jsp:forward>

转发时携带参数:

<jsp:forward page="">
	<jsp:param name="" value=""></jsp:param>
	<jsp:param name="" value=""></jsp:param>
	...
</jsp:forward>

(6)

<jsp:include page="">

<%@ include file="" %> 功能相同

例子演示

...

//3.将传递的请求包装成一个对象   domain javaBean pojo
//  view--请求-->controller--参数VO-->service--参数PO-->dao-->数据库
Atm atm = new Atm();
atm.setAname(aname);
atm.setApassword(apassword);
atm.setAbalance(Float.parseFloat(abalance));

//接收前面传递的参数
Enumeration en = request.getParameterNames();
while(en.hasMoreElements()){
    String key = (String)en.nextElement();
    String value = request.getParameter(key);
}

...

Servlet 部分代码(创建对象、对象的赋值取值、请求转发…),替换为 JSP 动作标签:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<jsp:useBean id="atm" class="domain.Atm" scope="request"></jsp:useBean>

<jsp:setProperty name="atm" property="*"></jsp:setProperty>
<%--注释: property与param相同,所以上一行可以替换下面三行--%>
<jsp:setProperty name="atm" property="aname" param="aname"></jsp:setProperty>
<jsp:setProperty name="atm" property="apassword" param="apassword"></jsp:setProperty>
<jsp:setProperty name="atm" property="abalance" param="abalance"></jsp:setProperty>

<%--注释: 请求转发并携带参数--%>
<jsp:forward page="">
    <jsp:param name="testKey1" value="testValue1"></jsp:param>
    <jsp:param name="testKey2" value="testValue2"></jsp:param>
    ...
</jsp:forward>

  • JSP 三个代码标签 <% %> <%! %> <%= %>
  • JSP 三个指令标签 <%@ page %> <%@ taglib %> <%@ include %>
  • JSP 六个动作标签 <jsp:xxx>xxx包含:useBean、setProperty、getProperty、forward、param、include
  • JSP 四个作用域 page(pageContext) request session application
  • JSP 九个内置对象 request response session application out page pageContext config exception
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

J2EE JSP 基础知识总结 的相关文章

随机推荐

  • 无人机光电吊舱目标定位

    64 无人机光电吊舱目标定位TOC 参考论文 一种基于KL AEPF的无人机侦察移动目标定位算法 了解目标定位需要用到的坐标系 这篇论文这部分讲的不错 xff01 一种基于KL AEPF的无人机侦察移动目标定位算法 end 一种基于KL A
  • 位置式PID和增量式PID的区别(转载)

    参考 https blog csdn net as480133937 article details 89508034 上述文章中给出了位置式PID和增量式PID的公式及区别 xff0c 比较容易理解
  • 步进电机介绍

    简介 步进电机是一种将 电脉冲信号 转换成 相应角位移或线位移 的电动机 每输入一个脉冲信号 xff0c 转子就转动一个角度或前进一步 xff0c 其输出的角位移或线位移与输入的脉冲数成正比 xff0c 转速与脉冲频率成正比 因此 xff0
  • NXP SDK包导入到MCUxPress

    NXP SDK包导入https blog csdn net weixin 43086497 article details 117023228
  • git学习

    下面这个主要是介绍git的相关的指令 https blog csdn net sinat 20177327 article details 76062030 下面这个是git安装软件地址 添加链接描述
  • 关于IAR项目文件中*.icf的相关理解

    https www cnblogs com henjay724 p 8191908 html
  • 学习《apache源代码全景分析》之存储段和存储段组摘录

    1 当数据在过滤器中流动传递的时候 xff0c 数据是以存储段组的形式组织的 每一个存储段组包含多个存储段 xff0c 每一个存储段是一种数据类型的抽象 2 存储段组包含多个存储段 struct apr bucket APR RING EN
  • Pod提示NetworkPlugin cni failed to set up .. network:open/run/flannel/subnet.env:nosuchfileordirectory

    K8s在创建pod时发现pod状态为ContainerCreating状态 检查pod的日志发现提示 Failed create pod sandbox rpc error code 61 Unknown desc 61 failed to
  • 【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser

    转载地址 https blog csdn net jiange zh article details 50639178 对于http服务器 xff0c http request的解析是比较麻烦的 xff0c 由于我们的重点并不在这上面 xf
  • Java 单例模式

    文章目录 单例模式单例模式Singleton单例模式的代码单例模式代码的分析单例模式的实现 单例模式 单例模式Singleton 当一个类的方法要被大量用户同时调用时 一般用户都会先创建这个类的对象再通过对象调用类中的方法 但是对象是存放在
  • J2EE Servlet 管理机制

    Tomcat 9 Servlet 管理机制 xff08 1 xff09 Servlet 对象 xff0c 通过生命周期托管的方式实现单例设计模式 xff08 2 xff09 默认效果是延迟加载 以 Tomcat9 为例 xff0c 需要在
  • idea 与 Tomcat 有一个美妙的约定

    IntelliJ IDEA 2020 1 2Tomcat 9 0 37 文章目录 一 xff1a Web 容器二 xff1a 下载 TomcatTomcat 容器的文件夹结构 三 xff1a 将 Tomcat 和 IDEA 集成在一起四 x
  • Java 线程 基础知识总结

    线程基础 很不严谨的说 xff0c 线程是什么 xff1f 线程就是为了让很多个东西并发执行 xff0c 大大的提高程序执行的效率啊 三个非常重要的概念 xff1a 程序 xff1a 一组写好了的静态代码块 xff08 就我们写的那些代码玩
  • 模拟银行系统 Java 四份代码(三种交互方式,两种数据存储方式)

    环境 编程语言 xff1a Java 14 0 1IDE xff1a intelliJ IDEA 2020 1 2有 Java demo 涉及到使用 idea 编辑器创建文件 读取文件 xff1b 有关编码问题 xff0c 请参考下图 id
  • Java 模拟数据库连接池 + 模拟ORM框架

    环境 编程语言 xff1a Java 14 0 1数据库 xff1a MySQL 8 0 xff08 用户名与密码都是root xff0c ip及端口是localhost 3306 xff09 JDBC xff1a mysql connec
  • Java 模拟考试系统(Swing + IO)

    编程语言 xff1a Java 14 0 1IDE xff1a intelliJ IDEA 2020 1 2 使用了MVC分层架构思想 xff0c 并且仅涉及JavaSE内容 功能 xff1a 登录 43 考试UI xff1a Swing数
  • Java IO 基础知识总结

    观前提示 xff1a 本文涉及的代码演示部分 xff0c 为了文章的观赏性 xff0c 许多代码演示中有意忽略了导包 异常处理 所谓 IO xff0c I xff08 input xff09 O xff08 output xff09 xff
  • Java 模拟浏览器与服务器之间请求与响应的过程

    环境与MVC分层架构思想 编程语言 xff1a Java 14 0 1IDE xff1a intelliJ IDEA 2020 1 2 V View视图层String html jspC Controller控制层Servlet 控制的是相
  • helm部署相关服务过程中问题记录

    在学习helm部署相关服务过程中出现一些相关问题 xff0c 自己记录并供大家一起学习 xff01 xff01 xff01 问题1 部署helm 获取软件包失败 在通过wget https storage googleapis com ku
  • J2EE JSP 基础知识总结

    Tomcat 9Java Server Page xff08 Java 服务页 xff09 一 xff1a JSP 初识 使用 JSP 文件 JSP 是 HTML 文件与 Java 文件的混合文件 xff0c HTML 文件可以直接通过浏览