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.使用
-
先导入jar包
-
然后再需要使用的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 } ${entry.value.name }
${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"/>