JSP 的概述观点
JSP 是 Java Server Pages 的简称,跟 Servlet 一样可以动态天生 HTML 相应, JSP 文件命名为 xxx.jsp。
与 Servlet 不同,JSP 文件以 HTML 标记为主,然后内嵌 Java 代码段,用于处理动态内容。
示例<%@ page import="java.util.Date" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <title>Hello Time</title> </head> <body> 现在的韶光是:<%= new Date()%> </body></html>
JSP 与 Servlet 的关系JSP 在静态 HTML 内容中嵌入 Java 代码,Java 代码被动态实行后天生 HTML 内容;Servlet 在 Java 代码中通过 HttpServletResponse 工具动态输出 HTML 内容。JSP 经编译后就变成了 Servlet。JSP 的实质便是 Servlet,JVM 只能识别 Java 的类,不能识别 JSP 的代码,Web 容器将 JSP 的代码编译成 JVM 能够识别的 Java 类。JSP 更善于表现于页面显示,servlet 更善于于逻辑掌握。Web 浏览器发送 HTTP 要求到做事端,被 Servlet 获取并进行处理(例如参数解析、要求转发);Servlet 调用核心业务逻辑得到处理结果;Servlet 将逻辑处理结果交给 JSP,动态输出 HTML 内容;动态天生的 HTML 内容返回到浏览器显示。JSP 的语法JSP 语法构造
声明区,程序代码区,表达式,注释,指令和动作,内置工具
声明区
基本语法:<%! %>
可以定义全局变量、方法、类。
<%! int i; public void setName(){ ... }%>
程序代码区
基本语法:<% 程序代码区 %>
可以定义局部变量以及放入任何的Java程序代码。
<% int j; for (int k=0; k<10; k++) { ... }%>
表达式
基本语法:<%= %>
可以输出一个变量或一个详细内容,但 = 后面必须是字符串变量或者可以被转换成字符串的表达式。
不须要以 ; 结束,由于只有一行。
<%= "hello world" %><%= i+1 %>
注释
注释的内容不会被实行。
<!-- HTML 文件的注释,浏览器可以查看到 --><%-- JSP 文件的注释,浏览器看不到 --%><% // Java 措辞中的单行注释,浏览器看不到 / Java 措辞中的多行注释, 浏览器看不到 /%>
指令和动作
指令格式:<%@指令 属性=“属性值” %>
指令的属性可以设定多个。
JSP常用指令有:page、taglib、include。
page 指令用于导包和设置一些页面属性,常用属性如下:
import 导入相应的包,惟一许可在同一文档中多次涌现的属性contentType 设置 Content-Type 相应报头,标明即将发送到浏览器的文档类型pageEncoding 设置页面的编码language 指定页面利用的措辞session 掌握页面是否参与 HTTP 会话errorPage 处理当前页面中抛出但未被捕获的任何非常isErrorPage 当前页是否可以作为其他页面的缺点处理页面taglib 指令用来扩展 JSP 程序的标签元素,引入其他功能的标签库文件。
<!-- prefix 属性用于指定库前缀 --><!-- uri 属性用于指定库的标识 --> <%@taglib uri="tagLibary" prefix="prefix" %><!-- 引入第三方的标签库 --><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
include 指令
用于引入另一个 JSP 程序或 HTML 文件等。
JSP 引擎会在 JSP 文件的转换期间先把 file 属性设定的文件包含进来,然后开始实行转换及编译的事情。
<%@include file="被包含的文件地址" %>
jsp:include
jsp:include 动浸染于引入另一个 JSP 程序或 HTML 文件等。
实行到 include 时,被 include 的文件才会被编译。
如果 include 的是 jsp 文件,那它暂时不会被转换成 Servlet 文件。
<jsp:include page="URLSpec" flush="true"/><jsp:include page="URLSpec" flush="true"> <jsp:param name="key" value="value"/></jsp:include>
include 指令和 jsp:include 动作的差异
include 指令是在 JSP 程序的转换期间就将 file 属性所指定的程序内容嵌入再编译实行(静态包含)。
jsp:include 动作在转换期间是不会被编译的,只有在客户端要求期间被实行到才会被动态的编译载入(动态包含,推举)。
jsp:forwardjsp:forward 动浸染于在 JSP 中实现转发,将要求转发到另一个指定的 JSP 程序或者 Servlet 中处理。
<jsp:forward page="urlSpec" flush="true"/><jsp:forward page="urlSpec"> <!-- 用于指定参数和其对应的值 --> <jsp:param name="key" value="value"/></jsp:forward>
在 JSP 程序中有 9 个内置工具由容器为用户进行实例化,程序员可以不用定义就直策应用这些变量。
在 JSP 转换成 Servlet 后,会自动追加这些变量的定义,利用内置工具可以简化 JSP 的开拓。
out 内置工具该工具类型是 JSPWriter。
该工具是一个缓冲的输出流,用来给客户端输出信息。
void println(String x) 向客户端输出各种类型数据void newLine() 输出一个换行符void close() 关闭输出流int getBufferSize() 返回缓冲区的大小int getRemaining() 返回缓冲区中未利用的字节数void flush() 输出缓冲区里的数据void clearBuffer() 打消缓冲区里的数据,同时把数据输出到客户端void clear() 打消缓冲区里的数据,但不把数据输出到客户端request 内置工具该工具封装的是调用 JSP 页面的要求信息,它是 HttpServletRequest 接口的一个实例。
该工具的属性值只在一个要求中保存。
String getMethod() 返回客户端向做事器端传送数据的办法String getParameter(String name) 返回客户端向做事器端传送的参数值String[] getParameterValues(String name) 得到指定参数的所有值String getRequestURI() 得到要求地址String getRemoteAddr() 返回发送要求的客户端或末了一个代理的 IP 地址int getRemotePort() 返回发送要求的客户端或末了一个代理的端口号String getServerName() 获取做事器的名字int getServerPort() 获取做事器真个端口void setAttribute(String name, Object o) 在此要求中存储属性。属性在要求之间重置Object getAttribute(String name) 将指定属性的值作为工具返回,若不存在则返回空值response 内置工具该工具浸染是相应信息,用于给客户端输出相应的处理结果,它是 HttpServletResponse 接口的一个实例。
该工具常常用于设置 HTTP 标题,添加 cookie、设置相应内容的类型和状态、发送 HTTP 重定向和编码 URL。
void addCookie(Cookie cookie) 添加一个 Cookie 工具,用于在客户端保存特定的信息void addHeader(String name, String value) 添加 HTTP 头信息,该 Header 信息将发送到客户端boolean containsHeader(String name) 判断指定名字的 HTTP 文件头是否存在void sendRedirect(String location) 重定向 JSP 文件void setContentType(String type) 设置类型与编码办法session 内置工具该工具表示浏览器和做事器之间的一次会话;一次会话可以包含多次要求,在多次要求之间可以借助 session 工具存储信息,它是 HttpSession 类型的一个实例。
该工具的属性值在一次会话范围中保存,保存在做事器端,只要不关闭浏览器,默认半个小时内都可以访问。
void setAttribute(String name, Object value) 利用指定的名称将工具绑定到此会话Object getAttribute(String name) 返回在此会话中用指定名称绑定的工具,如果没有工具在该名称下绑定则返回空值application 内置工具该工具代表全局高下文,是一个 web 程序的全局变量,它是 ServletContext 类型的一个实例。
该工具在全体做事器上保存数据,所有用户共享。
void setAttribute(String name, Object object) 将工具绑定到此 servlet 高下文中的给定属性名Object getAttribute(String name) 返回给定名称的 servlet 容器属性,若没有该名称的属性返回 nullpageContext 内置工具该工具表示 JSP 页面高下文,是 PageContext 类型的工具,可以利用这个工具来管理其他的隐含工具。
该工具只在一个页面中保存数据。
void setAttribute(String name, Object value, int scope) 利用适当的浸染域设置指定的名称和值Object getAttribute(String name, int scope) 返回指定浸染域中名称关联的工具,若找不到则返回 nullServletRequest getRequest() 获取要求工具ServletResponse getResponse() 获取相应工具HttpSession getSession() 获取会话工具ServletConfig getServletConfig() 获取配置工具JspWriter getOut() 获取输出工具Object getPage() 获取页面对象Exception getException() 获取非常工具page 内置工具该工具的类型是 Object。
该工具是 JSP 页面本身。
config 内置工具该工具的类型是 ServletConfig。
该工具是 Servlet 配置工具。
exception 内置工具该工具是 Throwable 的实例,表示的是 JSP 的非常信息,浸染是捕获网页非常。
如果要利用它,必须将跳转的缺点页面(如 error.jsp)的 page 指令的 isErrorPage 属性设置成 true。
单个页面的处理办法:
<%@page errorPage="error.jsp" %>
在 web.xml 中配置统一的非常处理页面:
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error.jsp</location></error-page>
JavaBean 是利用 Java 措辞开拓的一个可重用的组件,在 JSP 开拓中可以利用 JavaBean 减少重复代码,使全体 JSP 代码的开拓更加简洁。
JavaBean 实质上便是 Java 类,常日哀求如下:
属性 - 全部私有化,通过 get 和 set 方法进行访问。方法 - 必须是 public 关键字润色。布局器 - 必须有无参布局方法。利用办法利用 jsp:useBean 的办法创建 javaBean 实例;保存范围有 page|request|sessin|application,默认为 page 范围。
<jsp:useBean id="工具名" scope="保存范围" class="包名.类名" />
利用 jsp:setProperty 的办法设置 javaBean 的属性值。
<jsp:setProperty name="工具名" property="属性名" value="属性值" param="参数名"/>
利用 jsp:getProperty 的办法获取 javaBean 的属性值。
<jsp:getProperty name="工具名" property="属性名"/>
保存范围
JavaBean 的保存范围有 page、request、session 以及 application,默认是 page 范围。
删除办法<% 内置工具.removeAttribute(“JavaBean 的名字”); %>
MVC 是模型(Model)和视图(View)以及掌握器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织办法,这样在改进界面及用户交互时,不须要重新编写业务逻辑,从而提高了代码的可掩护性。
M:紧张用于封装业务数据的 JavaBean(Bean) 和 业务逻辑的 JavaBean(Service) 及访问数据库的 DAO 工具。
V:紧张卖力数据网络和数据展现,常日由 JSP 文件完成。
C:紧张卖力流程掌握和页面跳转,常日由 Servlet 完成。
基本模型浏览器发起要求;Servlet 接管处理要求,通过 JavaBean 封装业务数据和业务逻辑;Servlet 通过 Dao 工具来访问数据库,数据库把数据以 JavaBean 的形式发给 Servlet;Servlet 对数据进行业务逻辑处理并将结果发给 JSP;JSP 动态输出 HTML 页面到浏览器。想理解更多,欢迎关注我的微信公众年夜众号:Renda_Zhang