JSP简介
Java Server Pages Java服务器页面
JSP实质上也是一种Servlet。可以在tomcat中的work目录中找到jsp转译的对应的servlet文件。
JSP的运行过程
jsp本身不能被直接运行,需要先转译(转换)成Java源代码,然后编译成字节码(.class文件)才能运行。
JSP的页面指令
JSP页面的设置。
语法:
<%@ 指令名称 指令属性 %>
常见的指令:
page指令:是在JSP进行基本设置,包含语言、导入包、字符集、缓存、错误页面等。import表示导入包。
<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
include指令:页面之间的包含。
静态包含,能够包含另外一个页面的所有内容,当包含的标签写在什么地方,就将对应的内容显示在什么地方。
如果在a页面定义了变量,在b页面可以直接使用,因为在转译的时候,b页面会把a页面的内容直接放进去再编译成字节码。
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>Hello</h1>
<%
int i;
%>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>world</h1>
<%@ include file="a.jsp" %>
<%
i = 5;
%>
taglib指令:页面导入其他的第三方的自定义的标签库。
在页面上要使用其他第三方自定义的标签库,需要使用taglib指令导入对应的标签库,见下面JSTL标签库的使用。
JSP标准动作
<jsp:include page=""></jsp:include>
动态包含:在代码中包含了a.jsp页面,直到运行的时候才会加载a.jsp中间的内容。
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>Hello</h1>
<%
int i;
%>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>world</h1>
<jsp:include page="a.jsp"></jsp:include>
<%
int i = 5;
%>
JSP的脚本
包含基本脚本,表达式和声明。
脚本语法结构为:<% 代码;%>
表达式语法结构为:<%= 代码(变量)%>注意,后面一定不能写分号,意思是out.print(代码(变量))
声明的语法结构为:<%! 代码; %> 一般用来定义属性或者定义方法。
注意:上面的脚本语法结构%!=这些符号中间不能加空格。
<body>
<form action="login.jsp" method="post">
<%-- input type="text" name="username" placeholder="用户名"/><br/--%>
<input type="password" name="pwd" placeholder="密码"/><br/>
<input type="submit" value="登录"/>
</form>
<%
String str = "Hello, world";
%>
<h1 style="color: red;"><%= str %> </h1>
<%! int i = 1; %>
<h1>你是第<%=i++ %>位访问的用户</h1>
<%!
public void test(){
}
%>
</body>
JSP页面注释
语法结构为:<%-- 注释的内容 --%>
与的不同在与,JSP的注释内容不会发送到客户端浏览器,而html的注释会发送。浪费性能和流量。
######JSP的内置对象
内置对象,又称为隐式对象,即在JSP页面不需要定义就可以直接使用的对象。
所谓的内置对象,直接可以使用的原因是因为页面上直接写的代码,实质上是在jsp生成的servlet对象中的service方法中写的代码,而service方法中已经定义了这些局部变量,所以页面上可以直接使用。而在页面上声明的方法是在service方法的外部,所以不能使用内置对象。
9大内置对象:
输入输出对象:对象的作用主要是用来做输入和输出的。
request:请求对象,能够接收并封装用户的请求,属于输入对象。HttpServletRequest类型的对象。
response:响应对象,能够通过输出信息或者跳转页面响应用户的请求,属于输出对象。HttpServletResponse类型的对象。
out:是将response中的输出信息单独定义的变量,属于输出对象。JspWriter类型的对象。
<body>
<%
String name = request.getParameter("name");
String [] hobby = request.getParameterValues("hobby");
Part part = request.getPart("photo");
request.setCharacterEncoding("utf-8");
request.getRequestDispatcher("other.jsp").forward(request, response);
response.getWriter().print("<h1>hello, world</h1>");
response.setContentType("text/html;charset=utf-8");
response.sendRedirect("other.jsp");
out.print("<h1>hello, world</h1>");
out.write("<h1>hello, world</h1>");
%>
</body>
作用域对象:对象的作用主要是将数据保存在某个服务器范围的作用域内。
request:请求作用域,能够将数据保存在请求关联的两个页面(或servlet)中。HttpServletRequest类型的对象。
session:会话作用域,能够将数据保存在一个会话中,在整个会话任何页面或servlet都可以访问该数据。HttpSession类型的对象。
application:应用作用域,能够将数据直接保存在服务器中,所有的其他用户在任何页面都可以访问,整个服务器范围,尽量少使用。ServletContext类型的对象。
pageContext:页面作用域,能够将数据保存到当前页面。PageContext类型的对象。
从大到小排列为:application、session、request、pageContext
request.setAttribute("key", value);
Object obj = request.getAttribute("key");
request.removeAttribute("key");
servlet对象:对象的作用主要是描述servlet相关信息。
page:就是当前jsp页面(servlet)对象。源码中是直接使用this。
config:当前jsp页面(servlet)的配置信息。是ServletConfig接口的对象。
异常对象:对象的作用主要是为了处理页面的异常。
exception:该对象只有在错误页面才能使用,普通页面不能使用。只有在page指令中使用数据isErrorPage="true"才是错误页面。
a.jsp 发生错误的页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="b.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<%
int i = 5 / 0;
%>
</body>
</html>
b.jsp 发生错误后显示的页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<h1>出错啦!!!</h1>
如果使用此方案,每个页面都需要指定对应的错误页面,太过于麻烦,使用比较少。
一般可能直接使用web.xml中errorCode配置。如下:
一般页面出错都会有一个错误的编码,例如常见的404(找不到页面),500(服务器代码出错)
常见的页面消息编码:
100:继续
200:OK,成功
400:
401:
404:
500:
501:
502:
503:
在web.xml中配置:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
EL表达式
Expression Language 表达式语言
语法结构:${}
注意:在web.xml的version是3.0以上的时候,默认可以直接使用EL表达式,如果是2.5或以下版本,可能不能直接使用,需要在page指令中加上属性isELIgnored="false"。
<%@ pageEncoding="UTF-8" isELIgnored="false"%>
<h1>${"3" + 3}</h1> 结果是6,没有字符串拼接,会将两个相加的内容转换成数字再运算,如果不能转换,则报错。
<h1>${5 / 2}</h1> 结果是2.5
可以进行基本的运算。
<%
String s = "hello";
request.setAttribute("h", s);
%>
<h1>${h}</h1>
EL表达式可以很好处理空指针的问题,如果一个对象或变量没有,则不显示,不会报错。
EL表达式只能显示四个作用域范围内的值,
<%
String s1 = "hello1";
session.setAttribute("h", s1);
%>
<h1>${h}</h1>
如果有多个作用域内保存名称相同的对象,那么直接使用EL表达式访问的时候,是从小到大的范围搜寻,找到后就显示。
如果要使用指定的作用域内的值,那么可以使用${sessionScope.h}
其他作用域分别写为:${requestScope.h},${applicationScope.h},${pageScope.h}
如果要显示对象中的属性值,可以使用${obj.name}或者${obj["name"]}或者obj['name']。
如果说要显示某个作用域范围内的对象的属性值${pageScope.obj.name}。
但是对象的属性是私有的,根本不能在外部访问,说明EL表达式虽然写的是obj.name,实质上是访问的obj.getName(),也就是说EL可以通过对象.名称的方式去调用get方
JSTL标签库
JSTL全称为JSP Standard Tag Library 即JSP标准标签库
要使用JSTL步骤如下:
1导入jtsl的jar包。
2在要使用的页面上使用taglib指令引用对应的库。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
分类:
core:核心标签库
通用标签:set,remove,out
条件标签:if,choose
循环:foreach,fortokens将字符串切割成数组并循环
fmt:格式化与国际化标签库
sql:sql标签库,操作数据库的
functions:函数标签库
xml:xml标签库
<c:set var="s" value="<h1>hello</h1>" scope="request"></c:set>
将value中的内容设置为变量s,并放入到request作用域中
<c:remove var="s" scope="request"/>
从request作用域中移除s变量
<c:out value="${s}" default="1" escapeXml="true"></c:out>
显示s变量,将标签也显示为文本,如果没有该变量,则显示1
<c:if test="${empty s}">
条件成立显示
</c:if>
<c:set var="n" value="2" scope="request"></c:set>
<c:choose>
<c:when test="${n==1}">
n等于1
</c:when>
<c:when test="${n==2}">
n等于2
</c:when>
<c:otherwise>
n是其他值
</c:otherwise>
</c:choose>
<%
String [] arr = new String[]{"a", "b", "ccc", "dddd", "e", "f", "g", "h", "i"};
request.setAttribute("arr", arr);
%>
<c:forEach items="${arr}" var="str" varStatus="i" begin="2" end="6" step="2">
${i.index}=====${str}<br/>
</c:forEach>