JSP:简化Servlet设计,在HTML标签中嵌入Java代码,用来高效开发Web应用的动态网页
JSP文件在容器中会转换成Servlet执行,JSP是对Servlet的一种高级封装,本质还是Servlet
Tomcat会将JSP文件转换成Java代码,进而编译成.class文件运行,最终将执行结果通过response响应给客户端
在web目录下,新建hello.jsp文件
直接在HTML代码中嵌入Java语句
<% out.println("北极"); %>声明全局变量和方法
<%! private String name = "MAX"; public String getName() { return name; } %>JSP注释不会被发送到浏览器中,也不会被编译,在网页查看源代码时查看不到JSP注释
<%-- 注释 --%>用来设置与整个JSP页面相关的属性
定义页面的依赖属性
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="404.jsp"%> <%@ page import="java.util.Map" %>包含其它文件
<%@include file="header.jsp"%>引入标签库的定义
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>创建User对象
<jsp:useBean id="user" class="com.robot.pojo.User"></jsp:useBean>查看编译之后的.java文件,找到创建对象的地方
com.robot.pojo.User user = null; user = (com.robot.pojo.User) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.PAGE_SCOPE); if (user == null){ user = new com.robot.pojo.User(); _jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.PAGE_SCOPE); }为User对象赋值
<jsp:setProperty name="user" property="username" value="机器人"></jsp:setProperty> <jsp:setProperty name="user" property="password" value="123456"></jsp:setProperty>获取User属性值
用户名:<jsp:getProperty name="user" property="username"/> 密码:<jsp:getProperty name="user" property="password"/><br>转发以及传递参数
两种传递 方式,因为中文会有乱码,所以需要设置编码
<% request.setCharacterEncoding("utf-8"); %> <jsp:forward page="index.jsp?address=beijing"> <jsp:param name="phone" value="15141958888"/> </jsp:forward>接收
<% String address = request.getParameter("address"); String phone = request.getParameter("phone"); %> <%=address%> <%=phone%>存储、获取数据
<% // 存储值 pageContext.setAttribute("username", "admin"); %> <% // 获取值 Object username = pageContext.getAttribute("username"); out.println(username); %>操作其它域对象
<% // 将数据存入request域中 pageContext.setAttribute("requestName", "requestData", PageContext.REQUEST_SCOPE); %> <% // 获取request域中的数据 pageContext.getAttribute("requestName", PageContext.REQUEST_SCOPE); %>移除数据
<% // 移除,在四个域中全都都查找一遍,将符合条件的全部删除掉 pageContext.removeAttribute("requestName"); // 移除,在指定的域中进行删除 pageContext.removeAttribute("requestData", PageContext.REQUEST_SCOPE); %>查找数据
<% // 在四个域中进行查找 String requestData = (String) pageContext.findAttribute("requestData"); %>原则:能用小的作用域,就不用大的作用域
主要用于获取作用域中的数据,用于替换域对象中的getAttribute(“name”);方法
使用
<% // 先将数据存储到域中 request.setAttribute("name", "zbx"); %> <%-- 获取值--%> ${name}获取引用类型
<% User user = new User("Robot", "123456"); pageContext.setAttribute("user", user); %> ${user}<br/> ${user.username}<br/> ${user.password}<br/>获取列表
<% List<String> list = new ArrayList<>(); list.add("北极"); list.add("宇宙"); list.add("太阳"); list.add("月亮"); pageContext.setAttribute("list", list); %> ${list} ${list[0]} ${list[1]} ${list[2]} ${list[3]}<br>JSP脚本在没有找到数据的时候会输出null,EL表达式在没有找到数据的时候不会输出任何内容,如果在JSP脚本中发生数组越界等,会报异常,但是在EL表达式中不会
获取Map
<% Map<String, String> map = new HashMap<>(); map.put("beijing", "北京"); map.put("shanghai", "上海"); map.put("666", "杭州"); pageContext.setAttribute("map", map); %> ${map} ${map.get("beijing")} ${map.get("shanghai")} ${map["666"]}Java Server Pages Standard Tag Library,JSP标准标签库
可以对EL表达式获取的数据进行逻辑操作,完成数据展示
使用
先导入两个jar包,jstl.jar和standard.jar
然后在JSP页面中引用标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>赋值
<c:set var="username" value="robot" scope="page"></c:set>可使用EL表达式直接获取到值
${username}输出
<c:out value="使用out输出"></c:out> <c:out value="${username}"></c:out><br>if判断语句
<c:if test="${3>2}"> <c:out value="输入"></c:out> </c:if>forEach循环语句
<% List<String> list = new ArrayList<>(); list.add("北极"); list.add("宇宙"); list.add("太阳"); list.add("月亮"); pageContext.setAttribute("list", list); %> <c:forEach var="l" items="${list}"> ${l} </c:forEach>选择语句
<c:set var="score" value="2"></c:set> <c:choose> <c:when test="${score==1}"> <c:out value="is 1"></c:out> </c:when> <c:when test="${score==2}"> <c:out value="is 2"></c:out> </c:when> <c:otherwise> <c:out value="is other"></c:out> </c:otherwise> </c:choose>