JSP

介绍

1.JSP=(Java + HTML)是服务端的动态资源,用来显示数据,获取数据。
2.JSP作为请求发起页面,显示表单;作为请求结束页面,显示数据。
3.Servlet作为请求中处理数据的环节

组成部分

JSP = Java源代码 + HTML标签 + JSP指令 + JSP标签

运行原理

JSP看上去是HTML,但是其本质是Servlet 。
*.jsp _— tomcat – > 编译成 – > *.java ----- > .class 最后运行的是.clas

JSP脚本片段

是指嵌套再<% %>中的一条或多条代码
1.<%java代码 %>
2.<%=%>
3.<%!%>声明,可以创建类的成员变量

<body>
	<h1 style="color:red;">我的第一个JSP程序</h1>
	<!-- JSP脚本片段 可以都多个,可以互相访问,必须符合Java语法-->
	<%int x = 1;%>
	<%int y = x + 1;%>
	<!-- JSP内置对象,无需初始化直接使用 -->
	<%out.print(y);%>
	<br>
	<!-- JSP中可以编写流程控制语句,通过jsp表达式的方式输出具体数字 -->
	<%for(int i = 1; i <= 10;++i){%>
	<span style="color:red"><%=i%></span>
	<%}%>
	<!-- 脚本片段if else -->
	<% boolean sex = true;%>
	<% if(sex){%><%}else{%><%}%>
<!-- JSP表达式 -->
	<%=y %><br>
<%=new Date() %>
<%!int num = 5; %>
<%@include file="include.jsp" %>
</body>
JSP表达式
  1. JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中。
    举例:Current time: <%= new java.util.Date() %>
  2. JSP表达式中的变量或表达式的计算结果将被转换成一个字符串,然后被插入进整个JSP页面输出结果的相应位置处。
  3. JSP表达式中的变量或表达式后面不能有分号(;),JSP表达式被翻译成Servlet程序中的一条out.print(…)语句。
JSP指令

JSP指令的基本语法格式:
<%@ 指令 属性名=“值” %>
注意属性名部分是大小写敏感的。

  1. page
<%@page import="java.util.Date"%>
  1. include
<%@include file="include.jsp" %>
  1. taglib
    prefix:指定标签库在页面中的前缀
    uri:指标标签库

自动提示以输入<%@ %>为例,点击alt+/,则自动提示
再web.xml中配置错误页面

 <!-- 配置错误页面 -->
 <error-page>
 	<error-code>404</error-code>
 	<location>/error.html</location>
 </error-page>
 <error-page>
 	<error-code>500</error-code>
 	<location>/error.html</location>
 </error-page>
 
 <error-page>
 	<exception-type>java.lang.RuntimeException</exception-type>
 	<location>/error.html</location>
 </error-page>
JSP标签

forward

JSP九大内置对象和四大作用域
内置对象作用域
pageContextPageContext类的当前页面上下文对象
sessionHttpSession类的会话对象
servletContext整个应用程序
config(ServletConfig)对应ServletConfig
page当前JSP页面的this当前对象
request(HttpServletRequest)请求对象
response(HttpServletResponse)响应对象
out(JspWriter)等同于response.getWriter()用来向客户端发送文本数据
Exception(Throwable)只有在错误页面中可以使用这个对象
pageContext

1.代表一个JSP页面的上下文对象

<body>
	<!-- pageContext可以获取其他内置对象 -->
	<%
		ServletRequest req = pageContext.getRequest(); 
		boolean isReq = (req == request);
	%>
	<%=isReq %>
</body>
jsp页面上四大域对象

在application、session、request、pageContext对象中都可以调用setAttribute方法和getAttribute方法来设置和检索各自域范围内的属性。
1.pageContext:当前jsp页面的上下文对象
2.Session:整个会话
3.Request:一个请求链
4.ServletContext:application整个应用程序
排序作用范围:ServletContext》Session》Request》pageContext
实例:

<!-- 四大作用域,设置属性及获取属性 -->
<%
	pageContext.setAttribute("name","张三");
	/* request.setAttribute("name", "李四");
	session.setAttribute("name", "王五");
	application.setAttribute("name", "赵六"); */
 %>
 <%=pageContext.getAttribute("name") %>
 <%=request.getAttribute("name") %>
 <%=session.getAttribute("name") %>
 <%=application.getAttribute("name") %>
 <!-- 测试作用域范围 -->
 <a href="index.jsp">index</a>
 
 <!-- 设置指定范围的属性 -->
 <!-- PageContext类中提供了对各个域范围属性进行统一管理的方法 -->
 <%
 	pageContext.setAttribute("sex", "男性", PageContext.SESSION_SCOPE);
	// 取session范围内的属性
	pageContext.getAttribute("sex", PageContext.SESSION_SCOPE);
 %>
<!--  跳转其他资源 -->
<%
	//请求转发
	pageContext.forward("/index.jsp");
%>

注意此处定义的request及session属性与从servlet定义的一致。

Base设置路径
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
 	// 1.使用动态的方式获取web应用程序的路径
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"
	+request.getServerName()+":"+request.getServerPort()+path+"/";
	
%>
<!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>
<!-- 使用base设置路径 -->
<%-- <base href="<%=basePath %>"> --%>
</head>
<body>
	<!-- 使用EL表达式pageContext.request.contextPath:获得当前web应用程序的路径 -->
	<a href="${pageContext.request.contextPath }/two">TwoServlet</a>
</body>
</html>
EL表达式

下面是ThreeServlet

package com.hpe.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.hpe.po.User;

@WebServlet("/three")
public class ThreeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 数组
		String[] array = {"张三","李四","王五"};
		request.setAttribute("array", array);
		// 请求转发到el.jsp页面
		// 集合
		List<String> list = new ArrayList<String>();
		list.add("罗志祥");
		list.add("李小璐");
		list.add("李晨");
		list.add("辛巴");
		request.setAttribute("list", list);
		// 创建对象
		User user = new User("张给", 30);
		request.setAttribute("user", user);
		// 创建泛型集合
		List<User> users = new ArrayList<>();
		users.add(new User("赵云",20));
		users.add(new User("关羽",22));
		users.add(new User("赵云",24));
		users.add(new User("张飞",26));
		users.add(new User("马超",24));
		users.add(new User("黄忠",25));
		users.add(new User("貂蝉",21));
		users.add(new User("小乔",20));
		request.setAttribute("users", users);
List<User> users1 = new ArrayList<>();
		request.setAttribute("users1", users1);
		
		List<User> users2 = null;
		request.setAttribute("user2", users2);
		// Map集合
		Map<String, User> map = new HashMap<>();
		map.put("u1", new User("小乔",20));
		request.setAttribute("map", map);
	
	request.getRequestDispatcher("/el.jsp").forward(request, response);
	}

}

下面是el.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>
	<%
		pageContext.setAttribute("name", "pageContext");
		request.setAttribute("name", "request");
		session.setAttribute("name", "session");
		application.setAttribute("name", "application");
	%>
	<!-- 方式1:out -->
	<%out.print(request.getAttribute("name")); %><br>
	<!-- 方式2:表达式 -->
	<%=request.getAttribute("name") %><br>
	<!-- 方式3:EL表达式 -->
	<hr>
	<!-- 从四个域对象中通过key找到对应value -->
	<!-- 寻找顺序:pageContext,request,session,application -->
	<!-- 如果找不到键未name的属性,会显示空字符串,不会显示null -->
	${name}<br>
	<!-- 获得指定域对象中的属性 -->
	${sessionScope.name }<br>
	${requestScope.name }<br>
	<!-- 使用pageContext获取绝对路径 -->
	<a href="${pageContext.request.contextPath}/two">TwoServlet</a><br>
	<!-- param获取参数值 -->
	参数值:${param.id }&nbsp;${param.age }
	<hr>
	<!-- 数组 -->
	${array[0] }<br>
	<!-- 集合 -->
	${list[0] }<br>
	<!-- 对象,根据get方法获取属性 -->
	${user.name }&nbsp;${user.age }<br>
	<!-- 泛型集合 -->
	${users[0].name }&nbsp;${users[5].name }<br>
	<!-- Map -->
	${map.u1.name }<br>
	<hr>
	<!-- EL表达式 -->
	${1==1 }<br>
	${1 eq 1 }<br>
	<hr>
	<!-- empty -->
	${empty "" }<br>
	${empty user }<br>
	${empty users1 }<br>
	${empty users2 }<br>
	<!-- 三目运算符 -->
	<%request.setAttribute("sex", 0); %>
	${sex eq 1?"男" : "女 " }
</body>
</html>
JSTL标签

将上述Servlet,请求转发改向jstl.jsp界面。下面是JSTL标签的基本使用

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 引入jstl标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>
	<%request.setAttribute("name", "放三"); %>
	<!-- EL表达式 -->
	${name }<br>
	<!-- c:out输出信息到页面 -->
	<!-- value:赋值 default:默认值 -->
	<c:out value="${name1 }" default="绽放"></c:out><br>
	<!-- set标签:设置属性值 也可以指定范围 scope:page,request,session,application -->
	<c:set var="a" value="hello" scope="request"></c:set>
	<c:set var="a" value="hello1" scope="session"></c:set>
	<!-- 取值 也可以从指定域范围中渠道值,如:requestScope.a -->
	${requestScope.a }
	<!-- c:remove移除属性 -->
	<c:remove var="a" scope="session"/>
	${requestScope.a }<br>
	${sessionScope.a }<br>
	<hr>
	<!-- if判断 test:表达式 -->
	<c:if test="${param.age < 18 }">
		<span style="color:red">未成年</span>
	</c:if>
	<c:if test="${param.age >= 18 and param.age <=35 }">
		<span style="color:blue">青年</span>
	</c:if>
	<!-- cwo相当于if elseif else -->
	<c:choose>
		<c:when test="${param.age < 18 }">少年</c:when>
		<c:when test="${param.age >= 18 && param.age<=45 }">青年</c:when>
		<c:otherwise>中老年</c:otherwise>
	</c:choose>
	<hr>
	<!-- c:forEach items:遍历的对象 var:每一次遍历元素 -->
	<c:forEach items="${array }" var="a">
		${a }
	</c:forEach><br>
	<c:forEach items="${users }" var="u">
		${u.name }
	</c:forEach><br>
	<c:forEach items="${map }" var="entry">
		<!-- entry.key,entry.value -->
		${entry.key }:${entry.value.name}
	</c:forEach><br>
	<!-- 遍历0-9之内的数字 -->
	<c:set var="count" value="9"></c:set>
	<c:forEach var="i" begin="0" end="${count }" step="2">
		${i }&nbsp;
	</c:forEach><br>
	<!-- status.count:当前元素的编号从1开始;
		 status.index:当前元素的编号从0开始 -->
	<c:forEach items="${users }" var="user" varStatus="status">
		${user.name }:${user.age }:${status.count }:${status.index }
	</c:forEach>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值