JavaWeb之JSP
JSP什么是JSPjsp是把html姿态资源转换为动态资源的一种技术,简单点说就是一个servlet,在servlet中写html代码。比如:在servlet中写out.println("<h1>Hello<h1>");JSP原理执行过程jsp页面的执行过程是用户请求服务器->服务加载jsp页面并把jsp页面转为.java的文件->在通过类加载器转为.cla
JSP
什么是JSP
jsp是把html静态资源转换为动态资源的一种技术,简单点说就是一个servlet,在servlet中写html代码。比如:在servlet中写
out.println("<h1>Hello<h1>");
JSP原理
执行过程
jsp页面的执行过程是用户请求服务器->服务加载jsp页面并把jsp页面转为.java的文件->在通过类加载器转为.class文件->返回服务器,最后展示给用户。
jsp本质
1、找到idea的空间,并找到运行的项目
2、在本项目下找到jsp文件夹。只有运行到了具体的jsp页面才会有响应的jap页面转为java文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtjCSmsa-1605257723915)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20201113095633192.png)]
3、打开文件
可以看到jsp文件实现JspSourceImports、和JspSourceDependent接口。
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {}
4、通过寻找发现JspSourceImports继承HttpServelt类,所以说jsp就是一个servlet
jsp源码分析
通过jsp生成的java文件
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.59
* Generated at: 2020-11-13 01:52:51 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
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;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
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;
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>$Title$</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" $END$\n");
out.write(" </body>\n");
out.write("</html>\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
是不是和servlet一样,都有init、service、Destroy方法,而且我们在页面写的jsp代码被转换为java代码.
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>$Title$</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" $END$\n");
out.write(" </body>\n");
在这个文件中还定义了如下参数:
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;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
其实这几个参数就是jsp中的内置对象,jsp中的内置对象是九个,为什么只有上面7个呢?还有两个就是request、response.
JSP基础语法
JSP表达式
<%= %>标签表示是表达式输出或者变量输出
<%= new Date()%>
<% int i=10;%>
<br>
<%=i%>
JSP脚本片段
<% %>标签写的代码只存在service方法中,所以这里的写法和在java中的写法一样。同样也可以和html标签混合使用,因为这个文件最终通过java的方式来写,也就是说通过 out.write("
<% for (int z=0;i<10; i++){%>
<h1><%System.out.println("标签:"+z);%></h1>
<%}%>
JSP声明
<%! %>标签写的代码不存在service方法中,也就是同个这个标签我们可以声明成员变量及其方法等,和java的操作一样
<%!
public Date getMyDate(){
return new Date();
}
%>
<%out.print("通过自定义方法获得的时间是"+getMyDate());%>
通过生成的jav文件可以看到我们定义的方法是不在service中:

JSP中的注释
<%-- --%>jsp的标签只在原码中显示,通过浏览器查看是看不到的。
<%--<% int i=10;%>--%>
JSP指令
jsp的指令有三个:page(设置页面的属性)、include(把其他文件导入本文件)、taglib。
page
<%@ page xx%>jsp的指令有很多,这里我只举例几个常用。
<%@ page import="java.util.Date" %>//导包
<%@ page contentType="text/html;charset=UTF-8" language="java" %>/。//设置响应内型
<%@ page errorPage="exciption.jsp" %>//出现404就装发到指定的页面
案例:error-page
我们故意制造错误用1/0;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="exciption.jsp" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<% int i=1/0;%>
</body>
</html>
创建异常页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>异常页面</h1>
</body>
</html>
错误页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>错误页面</h1>
</body>
</html>
结果:可以发现地址栏没变是转发到我们设定的页面
web.xml设置错误页面
如果非要分响应码来做响应的页面,那么需要配置web.xml。
如:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<error-page>
<error-code>404</error-code><!--当响应码为-->
<location>/error.jsp</location><!--响应这个页面-->
</error-page>
<error-page>
<error-code>500</error-code>
<location>/exciption.jsp</location>
</error-page>
</web-app>

include
这个指令是把其他的东西加载到本页中。
案例:
创建头文件Head.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>Head</h1>
创建尾部Footer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>Footer</h1>
创建Hello.js
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@include file="Head.jsp"%>
我是Hello
<%@include file="Footer.jsp"%>
</body>
</html>
扩展
通过标签导入文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="Head.jsp"></jsp:include>
我是Hello页面,通过jsp:include page标签导入的
<jsp:include page="Footer.jsp"></jsp:include>
</body>
</html>
总结:<jsp:include page=“Footer.jsp”></jsp:include>和指令<%@include file=“Footer.jsp”%>导入文件表面上看上去没有区别,但是在生成的java文件中有区别。
指令导入的文件只把另外的文件写道本java文件中,标签导入文件是把文件通过链接的方式导入。
指令导入的文件不可以出现相同的两给变量。标签的由于不在同一个方法中,所以可以定义相同的变量。
9大内置对象
jsp中的内置对象都在service中,所以只能在操作service中的数据。
pageContext//页面有用
session //一次会话有用
application//服务器不关闭就有用
config//配置文件
out//输出
page//页面
request//一次请求
response//响应
exception//异常
重点掌握:
pageContext//页面有用
request//一次请求
session //一次会话有用
application//服务器不关闭就有用
上面4个都有作用域,也就是说可以存储东西,其取值的范围和上面顺序一样。pageContext作用域最小,只在本页读写。request一次请求读写,不多可以转发。session //一次会话有用,application//服务器不关闭就有用
EL表达式:
EL表达式的功能:
获得数据
执行运算
获取web中开发的常用对象
EL表达式格式:
${ }
获得数据:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%! int i=10;
String age="23";%>
<% request.setAttribute("name","张三");%>
<h1>获得的age的值${age}</h1>
<h1>通过EL计算 ${10*3/1%4}</h1>
<h1>通过EL获得request中的值:${requestScope.name}</h1>
</body>
</html>
JSTL标签库
什么是jstl标签库?
jstl其实就是对html的不住之处做改进,他自定义了许多标签供我们使用,标签的功能和java一样。
根据JSTL标签所提供的功能,可以将其分为5个类别。
核心标签、格式化标签、SQL 标签、XML 标签、JSTL 函数
使用JSTL
1、使用任何库,你必须在每个 JSP 文件中的头部包含 标签。
核心库的:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>在IDEA中可能会出现解析失败JSTL这个原因是项目部署时没把JSTLjar包导入服务器中,需要手动导入。
2、maven导入jar包:
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
3.重点掌握的标签
1、<c:if test="" var="">,test表示判断添加先当于if()中的“()"功能 ,把得到的值赋给var
2、 <c:choose >、<c:when test="">、<c:otherwise >;choose:先当switch、wher:先当于case、otherwise:当执行条件都不满足时执行
3、 <c:forEach items="${strings}" var=“str” >;items:表示将要遍历的值、var:表示把items的值赋值给他、begin:表示从什么地方开始、end:什么地方结束、step:每次增加多少
<% int i=90;
ArrayList<String> strings = new ArrayList<>();
strings.add("张三");
strings.add("张飞");
strings.add("王五");
strings.add("李四");
request.setAttribute("strings",strings);
%>
<%--
--%>
<c:if test="${i>=60}" var="" >
<h3>及格</h3>
</c:if>
<c:if test="${i>=60}" var="" >
<h3></h3>不及格</h3>
</c:if>
<%--
choose:先当switch
wher:先当于case
otherwise:当执行条件都不满足时执行
--%>
<h1>c:choose</h1>
<c:choose>
<c:when test="${i>=60}">
<h3>choose及格</h3>
</c:when>
<c:when test="${i<60}">
<h3>choose不及格</h3>
</c:when>
</c:choose>
<c:otherwise></c:otherwise>
<h1>c:forEach</h1>
<%--
items:表示将要遍历的值
var:表示把items的值赋值给他
begin:表示从什么地方开始
end:什么地方结束
step:每次增加多少
--%>
<c:forEach items="${strings}" var="str" >
<c:out value="${str }"></c:out>
</c:forEach>
<c:forEach var="index" items="${strings}" begin="0" end="2" step="1">
<c:out value="${index}"></c:out><br>
</c:forEach>
JAVABean
javabean是什么
javabean其实就是一个很普通的类,主要用于ORM(对象关系映射)。
javabean中应该有构造方法,成员变量,及其成员变量的get/set方法。
JSP中使用javaBean
1、javabean
package com.taxing.test;
public class Studen {
private String name;
private String pass;
public Studen() {
}
public Studen(String name, String pass) {
this.name = name;
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public String toString() {
return "Studen{" +
"name='" + name + '\'' +
", pass='" + pass + '\'' +
'}';
}
}
2、jsp
获得bean
<jsp:useBean id="std" class="com.taxing.test.Studen" scope="page"></jsp:useBean>
设置数据
<jsp:setProperty name="std" property="name" value="小红"></jsp:setProperty>
<jsp:setProperty name="std" property="pass" value="1234"></jsp:setProperty>
获得数据
<jsp:getProperty name="std" property="name"/>
<jsp:getProperty name="std" property="pass"/>
更多推荐



所有评论(0)