9.JSP
9.1 jsp介绍
- jsp:java server pages:java服务器端页面和servlet一样,用于动态web技术
- 写jsp就像在写HTML
- 现在的页面基本都是HTML了,静态模板技术取代了JSP
9.2 jsp和HTML区别:
- HTML给用户提供静态数据
- jsp页面可以嵌入java代码,给用户提供动态数据
9.3 JSP原理
- JSP执行过程:在服务器内部工作,tomcat中有一个work目录
- 我们使用的时idea集成的tomcat会在idea的tomcat中生成一个work目录,将正在访问的jsp页面编译为java/class文件
- 正在访问的jsp页面被编译为java文件
- HttpJspBase 继承了HttpServlet
- 浏览器向服务器发送请求,无论访问什么资源,本质是访问servlet
- jsp本质上时servlet
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {}
9.3.1 源码刨析
-
判断请求
-
内置对象9个
final javax.servlet.jsp.PageContext pageContext; //页面上下文 javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; HttpServletRequest req HttpServletResponse resp ServletException exception
- 输出页面前增加代码,响应和对象设置
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
- 上诉对象可以在jsp中直接使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%String name="托尼";%>
<%=name%>
</body>
</html>
- jsp页面中,java代码会原样输出
- 若是html代码则会转换输出到前端,是为渲染的过程
9.4 jsp基础语法
- 普通项目转web项目
- 此方式创建的web项目会有更新局部类功能
- 引入jar包taglibs-standard、jstl-api
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
-
jsp是java的一种应用,扩充了自己的一些语法,java语法对其支持
-
<%= %>等价于一个表达式,不需要;
9.4.1 jsp表达式,遵循java规则
<%--jsp表达式,将程序结果输出到客户端--%>
<%= new Date()%>
9.4.2 jsp脚本片段
<%
String name = "zs";
%>
- 也可以脚本片段和html代码混合使用
<%
String name = "zs";
out.write("<h4>name="+name+"</h4>");
%>
<p>分割</p>
<%
out.write("<h3>name="+name+"</h3>");
%>
9.4.3 jsp声明,被service方法调用
<%--jsp声明提高作用域在,源码service方法外部,servlet类中--%>
<%!
static {
final double PI=3.14;
}
%>
- jsp注释不会显示在页面上,html注释页面上依然存在
<%--jsp注释--%>
<!--html注释-->
9.5 jsp指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %>
<%--指定错误页面,isErrorPage="true"显示的声明是错误页面--%>
<%--<%@page errorPage="error/error.jsp" isErrorPage="true" %>--%>
- jsp脚本和jsp标签区别
<%--jsp脚本--%>
<%@include file="common/header.jsp"%>
<h3>主体</h3>
<%@include file="common/footer.jsp"%>
<hr>
<%--jsp标签--%>
<jsp:include page="/common/header.jsp"/>
<h3>主体</h3>
<jsp:include page="/common/footer.jsp"/>
- 拼接引入的页面
- 两个同名同类型变量,在jsp脚本合并的页面会冲突,但在jsp标签拼接的页面时,由于时若干个页面所以不会冲突。
9.6 jsp内置对象9个
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this; //不用
HttpServletRequest req
HttpServletResponse resp
ServletException exception
- 使用方式:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--4大作用域--%>
<%
pageContext.setAttribute("user4","赵六");//本页面
request.setAttribute("user1","张三"); //本次请求,转发也会传输
session.setAttribute("user2","李四");//当前会话,浏览器打开到关闭
application.setAttribute("user3","王五");//当前web容器,服务器打开到关闭
%>
<%
//设置作用域,第三个参数
pageContext.setAttribute("user4","赵六",PageContext.SESSION_SCOPE);//当前会话,浏览器打开到关闭
%>
<%--java中不要写jsp注释等内容,会原样输出到servlet类中
pageContext域中取数据,会遵循从小到大作用域的方式查找,
类似:jvm的双亲委派机制,应用加载器中存在某个根加载器中的类,它不会即可利用应用加载器中的,他会先找扩展类的,找不到在找根加载器的,找到后从上到下加载
跨页面后,若request请求不转发,则只能从session、application作用域中取到值
--%>
<%
String user1 = (String)pageContext.findAttribute("user1");
String user2 = (String)pageContext.findAttribute("user2");
String user3 = (String)pageContext.findAttribute("user3");
String user4 = (String)pageContext.findAttribute("user4");
String user5 = (String)pageContext.findAttribute("user5");
%>
<%--用el表达式输出,null值不输出--%>
<h2>作用域中的值为:</h2>
<h3>user1===${user1}</h3>
<h3>user2===${user2}</h3>
<h3>user3===${user3}</h3>
<h3>user4===${user4}</h3>
<h3>user5===${user5}</h3>
<%--jsp表达式的输出项,null值输出--%>
<h3>user5===<%=user5%></h3>
</body>
</html>
<%pageContext.forward("/page.jsp");
/*效果等同*/
/*request.getRequestDispatcher("/page.jsp").forward(request,response);*/%>
- 使用场景
request:clinet向service发送请求,产生的数据,用户使用完不用了。新闻
session:clinet向service发送请求,产生的数据,用户使用完稍后还有用。购物车
application::clinet向service发送请求,产生的数据,用户使用完稍后别的用户有用。在线人数
9.7 jsp标签,jstl标签,el表达式
9.7.1 el表达式作用${}
- 获取数据(作用域中的数据)
- 执行运算
- 获取web开发的常用对象
- 调用方法(不常用)
注意:EL表达式不需要导包 jstl才需要导包
9.7.2 jsp标签
<jsp:forward page="/page04.jsp">
<jsp:param name="name" value="托尼"/>
<jsp:param name="pwd" value="123456"/>
</jsp:forward>
<p>page04页面</p>
name==<%=request.getParameter("name")%>
pwd==<%=request.getParameter("pwd")%>
9.7.3 jstl标签
-
是一个JSP标签集合,它封装了JSP应用的通用核心功能
-
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
-
为弥补html标签的不足;自定义了许多标签,可以使用,标签的功能和java代码一样
-
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- SQL 标签
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
- XML 标签
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
- JSTL 函数
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
问题:服务器无法解析jstl.jar包,tomcat的lib包中缺少jstl-api-1.2.jar和standard-1.1.2.jar包
- el表达式获取表单数据用${param.参数名}
- c:if使用
<form action="page05.jsp" method="post">
<%--el表达式获取表单数据用${param.参数名}--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="提交">
</form>
<c:if test="${param.username=='root'}" var="isCheck">
<c:out value="进入管理界面"></c:out>
</c:if>
<c:out value="${isCheck}"></c:out>
- c:choose使用
<c:set var="goods" value="50">
</c:set>
<c:choose>
<c:when test="${goods>=50}">
高于50%
</c:when>
<c:when test="${goods<50}">
低于50%
</c:when>
</c:choose>
- c:forEach使用
<%String[] arrs = {"as","cv","we"};
request.setAttribute("arrs",arrs);
ArrayList<String> arrayList = new ArrayList<>();
//下标从0开始
arrayList.add(0,"sd");
arrayList.add(1,"sds");
arrayList.add(2,"sdse");
request.setAttribute("arrayList",arrayList);
%>
<c:forEach var="arr" items="${arrs}">
<c:out value="${arr}"></c:out>
<br>
</c:forEach>
<c:forEach var="list" items="${arrayList}">
<c:out value="${list}"></c:out>
<br>
</c:forEach>
9.8 JavaBean
- 实体类:
JavaBean的特性:
必须有一个无参构造
属性必须私有化
有对应的get/set方法
- 一般和数据库表字段做映射,叫OR0M映射
ORM映射关系
表-实体类
字段-属性
行-对象
- idea连数据库时要设置时区:serverTimezone=UTC
<jsp:useBean id="user" class="com.zk.pojo.User" scope="page"></jsp:useBean>
<jsp:setProperty name="user" property="id" value="20"/>
<jsp:setProperty name="user" property="name" value="虚竹"/>
<jsp:setProperty name="user" property="password" value="12456"/>
<jsp:setProperty name="user" property="email" value="12456@123.com"/>
<% Date date = new Date(System.currentTimeMillis());%>
<jsp:setProperty name="user" property="birthday" value="<%=date%>"/>
id==<jsp:getProperty name="user" property="id"/>
name==<jsp:getProperty name="user" property="name"/>
password==<jsp:getProperty name="user" property="password"/>
email==<jsp:getProperty name="user" property="email"/>
birthday==<jsp:getProperty name="user" property="birthday"/>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123938.html