JSP总结

1. 概述

JSP全称Java Server Pages,是一种动态网页开发技术

.html是静态文件

.jsp是动态文件

2. 运行

浏览器可以直接运行.html文件,但不能直接运行.jsp文件

jsp文件需要在web容器中运行,因为web容器中有jsp的运行环境

其中最核心的有JSP的引擎(jasper.jar),它可以将jsp页面翻译成java程序,并编译成class文件,然后再运行。所以jsp文件运行的方向是java代码中的结果传递给html,所以html文件中的内容无法传递给jsp代码

//如jsp代码
<% String name = "tom" %>
<h1><%= name %></h1>

    
//翻译成java代码
PrintWriter out = new PrintWriter();
String name = "tom";
out.print("</h1>");
out.print(name);
out.print("</h1>");

3. 关系

JSP本质上也是Servlet

4. 代码

1. 表达式

表达式中的代码将来翻译成java代码作为参数放在_jspService方法out.print(...)

形式:<%= %>

<%= 1+1 %>

//java代码
out.print(1+1)
2. 脚本

脚本中的代码将来翻译成java代码后直接放在_jspService方法中

形式:<% %>

3. 声明

声明中的代码将来翻译成java代码将作为成员变量、成员方法放在类中

形式:<%! %>

5. 指令

形式:<%@ %>

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

其作用分别是:
指定当前jsp页面中嵌入的语言是java
指定写回给浏览器页面的时候,contentType的内容
指定当前页面件保存时候所用的编码

在jsp中导入其他类和接口

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

设置jsp页面是否支持session的使用,默认为true

<%@ page session="true" %>

指定当前页面报错,会跳转到的error.jsp页面

<%@ page errorPage="error.jsp" %>

指定当前页面是专门用来显示错误的页面,在当前页面中可以使用隐藏对象exception来显示错误
信息

<%@ page isErrorPage="true" %>

<%= exception.getMessage() %>
2. include

include指令,可以将另外一个页面的内容引入到当前页面中指定的位置

形式<%@ include file="" %>

3. taglib

tablib指令,在jsp中引入标签库

例如,引入JSTL标签库

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

注意1,引入标签库,需要先在项目中引入对应的jar包
注意2,uri属性,指的是标签库的设置的URI地址
注意3,prefix属性,指的是给引入的标签库起一个别名,这样使用起来较为方便

6. 动作

jsp中还有内置的标签,称之为jsp的动作元素,它的本质就是把固定的java代码,封装成了标签的形式

例如

<jsp:useBean id="s" class="com.briup.bean.Student" scope="page"></jsp:useBean>

相当于:

<%
  Student s = null;
  s = (Student)pageContext.getAttribute("s");
  if(s==null){
    s = new Student();
    pageContext.setAttribute("s",s);
 }
%>

例如,

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

相当于:

<%
  Student s = (Student)pageContext.getAttribute("s");
  s.setName("tom");
%>

例如:

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

相当于:

<%
    Student s = (Student)pageContext.getAttribute("s");
    out.write(s.getName());
%>

例如,页面跳转

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

跳转的同时还可以传参数

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

一个页面包含/引入另外一个页面有俩种方式
静态包含, <%@include file="" %>
动态包含, <jsp:include page=""> </ jsp:include>

静态包含,在jsp翻译成java程序的时候,直接将另一个页面的内容原封不动的写入到代码中。
动态包含,在jsp翻译成java程序的时候,只会把包含的动作翻译成一个方法的调用,将来在访问的时候才会真正的去获取另一个页面的内容

注意,动态包含可以传参,静态包含不能穿参

7. 注释

1. HTML/XML
<!-- 注释内容 -->
2. jsp
<%-- 注释内容 --%>

8. 九大对象

类型 名字
PageContext pageContext
HttpServletRequest request
HttpSession session
ServletContext application
Object page
HttpServletResponse response
JspWriter out
ServletConfig config
Throwable exception

9. 路径

一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一样的,但是在jsp中可以动态获得该项目的URL地址,例如

<%
String path = request.getContextPath();
String basePath =
request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



<base href="<%=basePath%>" />

10. EL

EL(Expression Language),称为EL表达式,目的是为了使JSP写起来更加简单

形式:${ }

例如接收客户端参数

${request.msg}
${name}

这时候会按照pageContext request session application这样一个顺序依次的去找,有没有一个
叫name的值存在,一旦找到了就输出出来,最终没有找到那么就什么都不输出

例如,取出一个对象中的属性值

${requestScope.student.id}
${requestScope.student.name}
${requestScope.student.age}
//或者
${student.id}
${student.name}
${student.age}
//或者
${student["id"]}
${student['id']}
${student["name"]}
${student['name']}
${student["age"]}
${student['age']}

如,如果Student类中一个方法是getAddress,返回一个Address类的对象,Address类中有一个方法getCity,这个时候就可以这样写去拿到city属性的值.

${student.address.city} 

例如,输出数组、集合中的元素

<%
    String[] str = {"hello","world"};
    List<String> list = new ArrayList<String>();
    list.add("zhangsan");
    list.add("lisi");
    Map<String,Integer> map = new HashMap<String,Integer>();
    map.put("a",100);
    map.put("b",200);
    map.put("c",300);
    request.setAttribute("str",str);
    request.setAttribute("list",list);
    request.setAttribute("map",map);
%>
${str[0] }<br>
${list[1] }<br>
${map["c"] }<br>

11. JSLT

1.使用
  1. 先导入jar包

  2. 然后再需要使用的JSP页面中,使用tablib指令,将标签库引入:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    
2.<c: forEach>标签
<%
  List<Student> list = new ArrayList<Student>();
  list.add(new Student(1,"tom1",21));
  list.add(new Student(2,"tom2",22));
  list.add(new Student(3,"tom3",23));
  list.add(new Student(4,"tom4",24));
  session.setAttribute("list", list);
%>
<c:forEach items="${list }" var ="stu"> 
  ${stu.id } - ${stu.name } - ${stu.age } <br> 
</c:forEach>

例如,遍历List集合,假设students是放进request对象中的一个List集合,集合中存放的是Student类型的对象<c:forEach items="${request.students}" var="stu">

<c:forEach items="${students}" var="stu">
  <tr>
    <td>${stu.id }</td>
    <td>${stu.name }</td>
    <td>${stu.age }</td>
  </tr>
</c:forEach>

例如,遍历Map集合,假设有一个Map类型的集合,放到了request对象中,key是id值,value是Student对象

<c:forEach items="${map}" var="entry">
    ${entry.key }-->${entry.value.id } &nbsp; ${entry.value.name } &nbsp;
    ${entry.value.age }<br>
</c:forEach>
3. <c: if>标签
<%
request.setAttribute("score",40);
%>
<c:if test="${score>85 }">
  <font color="red">你的分数超过了85分</font>
</c:if>
4. <c: import>标签

jsp:include 的作用基本相同,但是 <c:import> 还可以选择把引入的内容先保存在一个变量
中,之后通过EL表达式再拿出来显示

5. <c: redirect> 标签

重定向标签
例如

<c:redirect url="a.jsp"/> 
posted @ 2021-10-19 21:37  热心邻居老王  阅读(68)  评论(0编辑  收藏  举报