JSP

JSP可以跟前端嵌套使用

基本语法

page指令:用于定义各种属性

  • import用于导入包
  • session:第一次访问jsp时创建session,默认为true
  • buffer:设置输出数据的缓存大小,默认8kb
  • errorPage:如果页面有错误可以跳转到指定资源errorPage="/uri",斜杠用于服务器,表示项目根目录
  • isErrorPage:是否创建throwable对象,默认false;true表示该页面是错误页面
  • contentType:服务器发送客户端的内容编码
  • pageEncoding:页面本身编码
  • isELIgnore:是否支持El表达式,默认false表示支持

include指令:包含另外的页面

静态包含:

<!-- 在服务器的文件不会出现被包含文件,效率较高 -->
<%@include file = "文件名"%>

动态包含:

<!-- 在服务器会生成文件 -->
<jsp:include page="/文件名"></jsp:include>

tablib指令

在jsp页面中导入JSTL标签库,替换jsp中的java代码

<%@ taglib uri="url"%>
<%--page用于定义JSP页面的各种属性--%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.DateFormat" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>第一个jsp页面</title>
</head>
<body>
    欢迎使用jsp技术
    <!--脚本-->
    <%
        //嵌套java代码
        int num = 10;
        Date date = new Date();
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        String now = df.format(date);

        //输出,jsp内置了一个out用于输出网页内容
        out.print(num+"<br/>");
        out.print(now+"<br/>"); 
        for (int i = 0; i < 10; i++) {
            out.print("有点像php了小老弟<br/>");
        }
    %>
    <%--jsp注释--%>
    <%--脚本表达式--%>
    <%--直接打印--%>
    <%=num%><br>
    <%=now%><br>

    <%--声明语法--%>
    <%!
        public String letterToUpper(String s){
            String result = Character.toUpperCase(s.charAt(0))+s.substring(1);
            return result;
        }
    %>
    <%
        String s = letterToUpper("hello");
        out.print(s+"<br/>");
    %>

    <%
        out.print("这个输出在后面");//写入缓冲区,没有直接放到response中
        response.getWriter().write("这个先输出");//直接放在response中
    %>
</body>
</html>

outresponse的区别:

  • out为JspWriter类型,response.getWriter()是PrintWriter类型
  • out的输出会放入缓存中,response.getWriter()直接放入response中
  • servlet使用后者,jsp中使用前者

JSP的6个动作标签

include:包含
forward:转发

<jsp:forward page="/xxx.jsp"></jsp:forward>

param:请求参数设置

<jsp:param value="值" name="key"/>

useBean:创建一个对象
setProperty:设置属性值
getProperty:获取属性值

<!-- 创建对象 -->
<jsp:useBean id="user" class="com.xm.domain.User"></jsp:useBean>

<!-- 赋值 -->
<jsp:setProperty property="username" name="user" value="xm"/>
<jsp:setProperty property="password" name="user" value="xxx"/>

<!-- 获取值,会在页面直接输出 -->
<jsp:getProperty property="username" name="user"/>

JSP九大内置对象

  • request
  • response
  • session
  • application
  • config
  • exception
  • out
  • pageContext
  • page
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP九大内置对象</title>
</head>
<body>
<%
    //request对象
    out.print(request.getRequestURL()+"<br>");
    out.print(request.getContextPath()+"<br>");//相对路径

    //response对象
    response.getWriter().write("最先输出"+"<br>");

    //session对象
    session.setAttribute("username","xxx");

    //application对象(上下文)
    application.setAttribute("count",0);

    //config配置对象
    //out对象输出
    //exception异常类

    //pageContext页面上下文 可以获取其他八个对象 可以作为容器
    pageContext.setAttribute("age",18);
    pageContext.getAttribute("age");
    //获取其他三个域(容器)的数据(request,session,application)
    pageContext.findAttribute("usename");//寻找顺序:pageContext,request,session,application
    //向其他容器存放数据
    pageContext.setAttribute("age",18,PageContext.APPLICATION_SCOPE);
    pageContext.setAttribute("age",18,PageContext.SESSION_SCOPE);
    pageContext.setAttribute("age",18,PageContext.REQUEST_SCOPE);
    pageContext.setAttribute("age",18,PageContext.PAGE_SCOPE);
    //转发和包含
    pageContext.forward("firstjsp.jsp");
    pageContext.include("/firstjsp.jsp");//动态包含

    //page当前对象(当前Servlet实例)
%>>
</body>
</html>

四个域对象

域对象即为容器,可以存放属性值,分别是request,session,application,pageContext,其中pageContext的范围最小,作用于只能在当前页面访问,但可以获取其他三个域对象的内容

从引用范围上来说,从小到大分别为:pageContext,request,session,application
pageContext适合在一个页面上使用,request适合在同一请求中,session适合同一会话中,application适合所有用户中,在实际使用时尽量用小范围的

EL表达式

是jsp中获取数据的一种规范,代替脚本表达式,EL表达式获取数据都是从域里面获取
EL的几种用法:

  1. 输出数据
  2. 输出对象
  3. 输出集合
  4. 执行运算
  5. 使用empty关键字判断是否为空(空引用,空字符串)
<%@ page import="com.xm.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
<%
    //el读取数据之前需要先把数据放入域里
    pageContext.setAttribute("username","apple");
    request.setAttribute("age",6);
    session.setAttribute("address","American");
    application.setAttribute("email","123123123");

    User user = new User("patota","123","163");
    session.setAttribute("user",user);

    List<String> list = new ArrayList<>();
    list.add("apple");
    list.add("huawei");
    list.add("xiaomi");
    list.add("oppo");
    list.add("vivo");
    request.setAttribute("list",list);

    HashMap<String,String> map = new HashMap<>();
    map.put("phone","xiaomi");
    map.put("computer","asus");
    request.setAttribute("map",map);
%>
<%--输出--%>
<%=pageContext.getAttribute("username")%>
<%--使用el表达式输出--%>
<%--可以省略前面的内容,不省略表示指定在哪里找,省略的话按照域范围从小到大找--%>
<%--输出变量--%>
${pageScope.username}<br>
${requestScope.age}<br>
${sessionScope.address}<br>
${applicationScope.email}<br>
<%--输出对象--%>
${user}<br>
${user.username}<br>
<%--输出集合--%>
${list[0]}<br>
${list[1]}<br>
${map.phone}<br>
${map.computer}<br>
<%--对于key是数字的时候,只能用下面这种写法--%>
${map["phone"]}<br>
${map["computer"]}<br>
<%--执行运算--%>
${1+2}<br>
${10/5}<br>
${1==1}<br>
${"xzm" == "mzx"}<br>
${10>5?"nice":"emmm"}<br>
<%--使用empty关键字--%>
${empty user}<br>
${empty hello}
</body>
</html>

EL隐士对象(11个)

  • pageContext:页面上下文,可以获取其他八个内置对象
  • pageScope requestScope sessionScope applicationScope:容器集合
  • param:从request里面取数据,相当于request.getParameter()
  • paramValues:将获取到的值存到数组里,相当于request.getParameterValues()
  • header:获取请求头,相当于request.getHeader()
  • headerValues:将请求头的值存到数组里,相当于request.getHeaderValues()
  • cookie:获取cookie,相当于request.getCookies()
  • initParam:获取初始化参数,需要先在web.xml中写出来
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL11个隐士对象</title>
</head>
<body>

<%--1. pageScope requestScope sessionScope applicationScope--%>

<%--2. pageContext--%>
    ${pageContext.request.contextPath}<br>
    ${pageContext.session}<br>
    ${pageContext.servletContext}<br>

<%--3. param--%>
    ${param.username}<br>

<%--4. paramValues--%>
    ${paramValues.hobby[0]}<br>
    ${paramValues.hobby[1]}<br>

<%--5. header--%>
    ${header.accept}<br>
    ${header["accept-Encoding"]}<br>
<%--6. cookie--%>
    ${cookie.JSESSIONID.value}<br>
</body>
</html>

JSTL通用标签

实现jsp中的逻辑处理,使用前需要先下载JSTL库,要放入web下的lib目录
使用前在JSP中需要先声明

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

只要有一下几个通用标签

  • set:设置变量标签,默认放入pageContext中,可以指定放入的域
<c:set var="username" value="可以用了吗"></c:set>
<c:set var="age" value="可以用了" scope="request"></c:set>
<%--为对象的属性赋值--%>
<jsp:useBean id="user" class="com.xm.domain.User"></jsp:useBean>
<c:set property="name" target="${user}" value="Test"></c:set>
${username}<br>
${requestScope.age}<br>
${user.name}<br>
  • out:输出标签
<c:out value="${age}" default="6"></c:out><br>
<c:out value="${email}" default="aaa@a.com"></c:out><br>
<%--默认为true,不会输出成html标签,false会按照html、css、js等编码输出--%>
<c:out value="<h1>标题</h1>" escapeXml="false"></c:out>
<c:out value="<script type='text/javascript'>while(true){alert('恶搞你')}></script>" escapeXml="false"></c:out><br>
  • remove:移除标签,从四个域中删除,可以指定删除域
<c:remove var="username" scope="request"></c:remove>
${username}
  • if:条件判断
<c:if test="${10>5}">
    10>5没错
</c:if><br>
  • choose:类似于switch,case
<c:set var="scope" value="90">
</c:set>
<c:choose>
    <c:when test="${scope>=90}">优秀</c:when>
    <c:when test="${scope>=80}">良好</c:when>
    <c:when test="${scope>=70}">一般</c:when>
    <c:when test="${scope>=60}">及格</c:when>
    <c:otherwise>不及格</c:otherwise>
</c:choose>
  • foreach:遍历
<c:forEach var="i"  begin="0" end="10" step="2">
    ${i}<br>
</c:forEach>
<%
    List<String> list = new ArrayList<>();
    list.add("China");
    list.add("England");
    list.add("Singapore");
    pageContext.setAttribute("list",list);
%>
<c:forEach var="s" items="${list}" varStatus="vs">
    值:${s}---状态:${vs.index},${vs.count}<br>
</c:forEach>