javaweb -jsp基础知识

概念

JSP(Java Server pages)
JSP全称是Java Server Pages,它和servle技术一样,都是一种用于开发动态web资源的技术。
简化的servlet设计,在html标签中嵌套java代码,用以高效的开发web应用的动态网页

作用

替换显示页面的部分的servlet

创建jsp

在web目录下创建新的.jsp文件(与WEB-INF平级)

jsp访问

在浏览器中输入http://ip:port/项目路径/资源名称

jsp与servlet

关系
  jsp文件在容器中会转化为servlet执行
  jsp是对servlet的一种高级封装,本质还是servlet
区别
  与servlet相比 jsp可以很方便的编写或者修改html网页  

在这里插入图片描述
在这里插入图片描述

Jsp组成结构

  1. 静态内容–>Html静态文本
  2. 注释
  3. 声明–><%! 函数或方法 %>
  4. 表达式–><%=java表达式%>
  5. Scriptlet–><% java代码 %>
  6. 指令–>以“<% @”开始,以“%>”结束,例如:<%@ include file = " Filename" %>
  7. 动作:以“<jsp: 动作”开始,以“”结束,例如:<jsp:include page=" Filename" />

脚本

脚本可以编写java语句,变量,方法或者表达式
JSP本质是一个类,说明这个JSP里面可以书写java代码,具体书写方式有三种。

  • <% 代码 %>:代码段(Scriptlet),在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
  • <%! 代码 %>:声明,在jsp转换后的java类的成员位置。
  • <%= 代码 %>:表达式,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么

普通脚本

语法 <%java代码%>

    <%
        out.print("456");//输出打印在页面
        System.out.println("123"); //输出打印在控制台
    %>

普通脚本可以使用所有java语法,除了定义函数,(因为普通脚本定义的东西都是在service方法里面的)

注意脚本与脚本之间不可嵌套,脚本与html标签可以嵌套(html标签在外面)


<h1><%out.print("hahah");%></h1>  //可以

声明脚本

语法 <%!定义变量,函数>

<%! 
      int a;
     Object obj=new Object();
     public void add(){
    
    
         
         System.out.println(1+1);
     }
  %>

注意
声明脚本的变量是全局变量
声明脚本的内容必须在普通脚本<%%>中调用
如果脚本声明中的函数具有返回值,可以使用输出脚本调用<%=%>

输出脚本

语法 <%=java表达式%>

<%=new java.util.Date()%>

输出脚本可以输出带有返回值的函数
输出脚本中不能加;

jsp注释

jsp注释主要有两个作用:为脚本代码作注释以及html内容注释
语法规则

语法 描述
<%–注释–%> jsp注释,注释内容不会被发送至浏览器甚至不会被编译
!–注释–> html注释,通过浏览器查看网页源代码时可以看见注释内容
 <!--HTML注释在网页源代码中会显示-->
 
 <%--jsp注释在网页中不会被显示--%>

JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。它与html页面的作用是相同的,获取数据和显示数据

jsp指令

##JSP三大指令:

  • page 设置页面信息
  • include 引入外部的资源文件
  • taglib 引入外部标签
jsp指令用来设置整个jsp页面的相关属性

在这里插入图片描述
在这里插入图片描述

page指令的属性

<%@ page ... %> 
设置页面信息,定义网页依赖属性,比如脚本语言、error页面、缓存需求等等

语法
<%@ page attribute="value1" attribute="value2" %>
page指令为容器提供当前页面的使用说明,一个jsp页面可以包含多个page指令

在这里插入图片描述

import:导包

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>

<%List<String> list=new ArrayList<>()%>

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

contentType: 等同于response.setContentType()
设置响应体的类型以及字符集为 text/html
设置当前jsp页面的编码 charset=UTF-8

pageEncoding: 指定当前JSP页面的编码,这个编码是给服务器看的,所以这个编码只需要与真实的页面编码一致即可

errorPage:当前页面发生异常后,会自动跳转到指定的错误页面

isErrorPage:标识当前页面是否是错误页面。

设置page.jsp页面的page指令的errorPage属性为true

并写一条错误语句 int i = 3/0;

创建一个JSP页面 error.jsp 用于显示错误

将该页面的isErrorPage属性设置为true
include指令

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


<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
   <% int i=3/0;%>


  </body>
</html>



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

<html>
<head>
    <title>Title</title>
</head>
<body>
 <h3>发生错误,请与管理员联系</h3>
</body>
</html>

语法: <%@ include file="被包含的jsp路径"%>
通过include指令来包含其他文件
被包含的文件可以是JSP文件,HTML文件或文本文件,包含的文件就好像是当前JSP文件的一部分,会被同时编译执行(静态包含)

<%@ include file="header.jsp"%>
<%@ include file="footer.jsp"%>

注意:可能会有重名冲突问题,不建议使用

<%@ taglib uri="外部标签库路径" prefix="前缀" %>
引入外部标签
taglib指令是用来在当前jsp页面中导入第三方的标签库

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

- prefix:指定标签前缀,这个东西可以随意起名
- uri:指定第三方标签库的uri(唯一标识)
- 当然,需要先把第三方标签库所需jar包导入到项目中

动作标签

jsp:include:在页面被请求的时候引入一个文件

jsp:forward:把请求转到一个新的页面

jsp:useBean:寻找或者实例化一个JavaBean

jsp:setProperty:设置JavaBean的属性

jsp:getProperty:输出某个JavaBean的属性

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

jsp:element:定义动态XML元素

jsp:attribute:设置动态定义的XML元素属性

jsp:body:设置动态定义的XML元素内容

jsp:text:在JSP页面和文档中使用写入文本的模板

语法
<jsp:action_name attribute="value" />
动作标签指的是jap页面在运行期间的命令

include

语法: <jsp:include page="相对URL地址"/>
<jsp:include> 动作元素会将外部文件输出结果包含在JSP中(动态包含)

属性 描述
page 包含在页面中的相对URL地址
 <jsp:include page="index.jsp"></jsp:include>

注意和include指令不同,它是将外部文件输出代码复制到了当前JSP文件中,而jsp:include动作不同,是将外部文件输出结果引入到了当前jsp文件中

  • include指令:是在编译级别完成的包含,即把当前JSP和被包含的JSP合并成一个JSP,然后再编译成一个Servlet。(静态包含)

  • include动作:是在运行级别完成的包含,即当前JSP和被包含的JSP都会各自生成Servlet,然后在执行当前JSP的Servlet时完成包含另一个JSP的Servlet。(动态包含)

useBean

语法 <jsp:useBean id="name" class="package.className"/>
jsp:useBean动作来加载一个将在jsp页面中使用的javaBean

在类载入后,我们可以通过jsp:setProperty 和 jsp: getproperty 动作来修改和获取bean的属性

setProperty

可以在jsp:useBean元素之后使用jsp:setProperty进行属性赋值

属性 描述
name name属性是必须的,它表示要设置的属性是那个Bean的id
property property属性是必须的,它表示要设置那个属性
value value属性是可选的,该属性用来指定Bean的值
 <jsp:useBean id="stu" class="com.blb.student" ></jsp:useBean>
  等价于 User user=new User()
  
   <jsp:setProperty name="stu" property="age" value="12" ></jsp:setProperty>
   <jsp:setProperty name="stu" property="id" value="1"></jsp:setProperty>
   <jsp:setProperty name="stu" property="username" value="dyk"></jsp:setProperty>

getProperty

jsp:getProperty动作提取指定的Bean属性的值,转化为字符串,然后输出

属性 描述
name 要检索的Bean属性名称,Bean必须已定义
property 表示要提取Bean属性的值
   <jsp:useBean id="stu" class="com.blb.student" ></jsp:useBean>

    <jsp:setProperty name="stu" property="age" value="12" ></jsp:setProperty>
    <jsp:setProperty name="stu" property="id" value="1"></jsp:setProperty>
   <jsp:setProperty name="stu" property="username" value="dyk"></jsp:setProperty>

   <jsp:getProperty name="stu" property="username"/> //会自动打印在页面
   <jsp:getProperty name="stu" property="id"/>
  <jsp:getProperty name="stu" property="age"/>

forward

语法 <jsp:forward page="相对URL地址"/>
jsp:forward动作把请求转发到另外的页面
属性 描述
page page属性包含的是一个相对URL
<jsp:forward page="error.jsp"></jsp:forward>

param

语法 <jsp:param name="" value=""/>
在转发动作内部使用,做参数的传递
  <jsp:forward page="target.jsp">
       <jsp:param name="sex" value="nan"/>
     </jsp:forward>


<%=request.getParameter("sex")%>

JSP生命周期

jsp本质是一个Servlet,它比Servlet的生命周期多了一个编译阶段。

编译阶段

实例化阶段

初始化阶段

执行阶段

销毁阶段

回收阶段

内置对象

在这里插入图片描述
request:HttpServletRequest对象,得到用户请求信息

response:HttpServletResponse对象,服务器向客户端的回应信息

pageContext:jsp页面上下文对象,包含页面信息,JSP的页面容器

session:会话对象,用来保存用户的信息(代表每个会话)

application:应用(ServletContext)对象,代表整个应用程序,所有用户的共享信息

config:配置(ServletConfig)对象,代表配置文件中的信息 ,服务器配置,可以取得初始化参数

out:jsp输出流(JspWriter)对象,用于页面输出

page:指向当前jsp页面的对象(基本不使用),指当前页面转换后的Servlet类的实例

exception:异常对象,表示JSP页面所发生的异常,在错误页中才起作用

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="loginServer.jsp">
		用户名:<input type="text" name="username"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="登录"> 
	</form>
</body>
</html>

loginServer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

这是loginServer.jsp页面<br>
<%
	/* 1. request */
	String username = request.getParameter("username");
	/* 2. response */
	response.getWriter().write("这是response回写的内容<br>");
	/* 3. out */
	out.write("这是out对象输出的内容<br>");
%>
从login.jsp接受到的值:<input value="<%=username%>">

	
</body>
</html>

config:配置(ServletConfig)对象,代表配置文件中的信息 ,服务器配置,可以取得初始化参数
web.xml

 <servlet>
    <servlet-name>config</servlet-name>
    <!-- 指定哪一个jsp为servlet -->
    <jsp-file>/config.jsp</jsp-file>
    <!-- 初始化参数 -->
  <init-param>
    <param-name>name</param-name>
    <param-value>hello config</param-value>
  </init-param>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>config</servlet-name>
  <url-pattern>/config</url-pattern>
  
  </servlet-mapping>

config.jsp


<body>
    <!--  获取初始化参数   -->
	 <%=config.getInitParameter("name") %>
</body>
</html>

exception:异常对象,表示JSP页面所发生的异常,在错误页中才起作用

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="exception.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		System.out.println(1/0);
	%>
</body>
</html>

exception对象:只有在 jsp 页面的 page 指令中设置 isErrorPage=“true” 的时候才会存在。

exception.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	error信息:<%=exception.toString() %>
</body>
</html>

四大域对象

在这里插入图片描述
pageContext 、request、session、application四个对象又被称为 jsp四大域对象

四大域对象

域对象是可以像 Map 一样存取数据的对象。

四个域对象功能一样。不同的是它们对数据的存取范围。

虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。

四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。

pageContext ====>>> request ====>>> session ====>>> application

pageContext对象
在这里插入图片描述

JSP四大作用域

pageContext:

作用在当前页面

设置参数
pageContext.setAttribute("key", "value");

获取参数
pageContext.getAttribute("key");

request:

作用在请求阶段 ,一次请求内有效

设置参数
request.setAttribute("key", "value");

获取参数
request.getAttribute("key");
返回的是对象

session:

作用在整个会话(及关闭浏览器)

servlet中设置参数
request.getSession().setAttribute("key", "value");

jsp中设置参数
session.setAttribute("key", "value");

获取参数
session.getAttribute("key");

application:

作用在整个应用程序(即关闭浏览器)

Servlet设置参数
request.getServletContext().setAttribute("key", "value");

jsp设置参数
application.setAttribute("key", "value");
获取参数
application.getAttribute("key");

总结
pagecontext 当前页面有效
request:一次请求内有效
session:一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application:整个 web 工程范围内都有效(直到关闭服务器)

pageContext获取其他内置对象

<%
      pageContext.getRequest();//返回request内置对象
       pageContext.getResponse();//返回response内置对象
       pageContext.getServletConfig();//返回config内置对象
       pageContext.getException();//返回exception内置对象
       pageContext.getPage();//返回page内置对象
       pageContext.getOut();//返回out内置对象
       pageContext.getServletContext();//返回application内置对象
       pageContext.getSession();//返回session内置对象
   
   %>

pageContext操作其他内置对象的作用域

      操作其他作用域存储
       pageContext.setAttribute("name","value");//当前页面有效  
       pageContext.setAttribute("name","value",PageContext.REQUEST_SCOPE);//request作用域 第三个参数等价于2
       pageContext.setAttribute("name","value",PageContext.SESSION_SCOPE);//session作用域 第三个参数等价于3
       pageContext.setAttribute("name","value",PageContext.APPLICATION_SCOPE);//application 第三个参数等价于4



    操作其他作用域获取
       
       pageContext.getAttribute("name");//当前页面有效
       pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);//request作用域 第二个参数等价于2
       pageContext.getAttribute("name",PageContext.SESSION_SCOPE);//session作用域 第二个参数等价于3
       pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE);//application 第二个参数等价于4

EL表达式

概念

EL使jsp写起来更简单,简洁,主要用于获取作用域中的数据

作用

用于替换作用域对象.getAttribute

EL的应用

${
    
    scope.name}获取具体某个作用域中的数据

${
    
    name}获取作用域中的数据 ,逐级查找(pageContext,request,session,application)
 <%
       //存储在request作用域
       request.setAttribute("name","dyk");

   %>
   ${
    
    requestScope.name}<%--获取request作用域对应的值,找到就返回值,没找到返回""--%>
    ${
    
    name}<%--  从最小作用域逐级查找name对应的值,找到就返回对应的值,没找到就返回""--%>

EL和jsp脚本的区别

request.getAttribute() 没有找到返回NULL

${
    
    scope.name} 没有找到返回""

EL的应用

使用EL获取作用域中的对象调试属性时,只能访问对象的get方法,必须遵守命名规范定义

获取应用类型

   <% student s=new student("dyk",13,1);
      request.setAttribute("student",s);

   %>
    ${
    
    requestScope.student.username} <%--    调用学生类中的 getUsername--%>

    ${
    
    requestScope.student.age} <%--    调用学生类中的 getAge--%>
    ${
    
    requestScope.student.id}  <%--    调用学生类中的 getId()--%>
    ${
    
    requestScope.student}   <%--    调用学生类中的 toString()--%>

获取数组,集合的元素

EL可以获取Array,List,Map中的元素,set由于没下标,无法直接访问元素,后续可遍历
 <%
       int[] array =new int[]{
    
    1,2,3,4,5};
       request.setAttribute("array",array);

   %>
    ${
    
    requestScope.array[0]} <%--   1--%>

   ${
    
    requestScope.array[3]} <%--  4--%>
<%List<String> li=new ArrayList<String>();
       li.add("1");
      li.add("2");
      li.add("3");
      request.setAttribute("li",li);
   %>
  ${
    
    requestScope.li[0]} <%--   1--%>
   ${
    
    requestScope.li[1]} <%--   2--%>

同理map集合也可以通map集合名.key的方法访问或者map集合名[“key”]访问

EL的运算符

在这里插入图片描述

${
    
    1+2} <br/>
${
    
    1*2} <br/>
${
    
    8/3 }<br/>  //和Java不一样
${
    
    8%2 }<br/>
${
    
    4-2 }<br/>
3
2
2.6666666666666665 
0
2

隐式对象

EL表达式语言定义了11个隐式对象

在这里插入图片描述
获取cookie对象


   ${
    
    pageContext.request.contextPath}
   
   ${
    
    cookie.username}<%--   获取名为username的cookie对象--%>
   ${
    
    cookie.password}<%--   获取名为password的cookie对象--%> 
   $(cookie.password.value)   <%--   获取名为password的cookie对象的value值--%> 

这样就不用原来的遍历取得cookie的值了

JSTL标准标签库

EL主要是用于作用域获取数据,虽然可以做运算判断,但是得到的都是一个结果
EL不存在流程控制,比如判断
EL对于集合只能做单点访问,不能实现遍历操作,比如循环

JSTL

JSP标准标签库(JSTL)是一个JSP标签集合

JSTL的作用

可对EL获取到的数据进行逻辑操作
与EL合作完成数据的展示

JSTL的使用

导入两个jar文件,standard.jar和jstl.jar文件拷贝到WEB-INF/lib

在JSP页面导入<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

核心标签

条件标签if判断

语法
<c:if test="条件"></c:if>

<c:if test="${2>1}">
    成立
</c:if>
<c:if test="${1>2}">
    不成立
</c:if>

多条件choose判断

语法:

<c:choose>
<c:when test="条件1">结果1</c:when>
<c:when test="条件2">结果2</c:when>
<c:when test="条件3">结果3</c:when>
<c:otherwise>结果4</c:otherwise>

</c:choose>



<c:set var="score" value="80"></c:set>
<c:choose>
    <c:when test="${score>=80}">
        良好
    </c:when>
    <c:when test="${score>=70}"></c:when>
    <c:when test="${score>=60}">
        及格
    </c:when>
    <c:otherwise>
        不及格
    </c:otherwise>
</c:choose>

也可以当if else<c:choose>
    <c:when test="${2>1}">
        成立
    </c:when>
    <c:otherwise>
        不成立
    </c:otherwise>
</c:choose>

迭代foreach标签

语法
<c:foreach
var="变量名"
items="集合"
begin="起始下标"
end="结束下标"
step="间隔长度"
varstatus="遍历状态"
</c:foreach>
<c:forEach var="stu" items="${stus}" begin="0" end="3" step="1" varStatus="sta">
    ${
    
    stu.username}
</c:forEach>

<%-- var 遍历出的每一项使用的变量存储--%>
<%-- items 集合(使用EL表达式)--%>

<%-- varStatus:变量的状态 遍历出的每一项内容的状态--%>
<%-- first 是否是第一行--%>
<%-- last 是否是最后一行--%>
<%-- count 当前行数--%>
<%-- index 当前元素的下标--%>

猜你喜欢

转载自blog.csdn.net/qq_44866153/article/details/110432900
今日推荐