java之JSP的使用

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"); // 获得页面表单元素name的值
		String [] hobby = request.getParameterValues("hobby"); // 获得页面表单元素中多个元素的值(常用于复选框)
		Part part = request.getPart("photo"); // 获得页面表单元素上传的文件信息
		request.setCharacterEncoding("utf-8"); // 对于post表单进行转码
		request.getRequestDispatcher("other.jsp").forward(request, response); // 跳转页面之请求转发
		
		response.getWriter().print("<h1>hello, world</h1>"); // 得到out对象并输出信息
		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,成功
400401404500501502503:
在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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值