JSP
Java Server Page
JSP脚本
三者有很严格的区分
expression: <%... %>
:内容会直接放到_jspService()
方法里
scriptlet:<%=... %>
:内容会放到out.print()
中,作为out.print()
的参数
declaration: <%!... %>
:内容会放到_jspService()
方法之外,被类直接包含
directives: <%@ ... %>
:用来导包等,主要写import
方法
为什么使用 JSP
允许静态的HTML网页受Servlet控制下的动态修改
JSP的优势
JSP其实是Servlet
index.jsp => index.jsp.java => index.jsp.class (Servlet)
JSP如何创造Servlet
JSP中的html部分以及java部分代码都会放到void _jspService()
方法中
例如:
JSP 更改方法
三个方法:
jspInit()
_jspService()
jspDestroy()
JSP语法
三种主要的构念类型:
- Scripting element: 让您指定将成为结果servlet的一部分的代码
- directives: 控制全局servlet的结构
- actions: 允许您指定应该使用的现有组件,或者控制JSP引擎的行为
直接输出的 Expression:<%= expression %>
放在方法体内的 Scriptlets:<% code%>
声明变量用的 Declaration:<%! code%>
expressions
用<%= expression %>
会直接输出
expression的内容会被转换为String并且插入页面中
- 在run-time时转换
- 可以使用与预先定义的变量指示Object,例如
request, response, session, out
scriptlets
<% code%>
用来插入Java代码,可以访问到之前定义过的变量。
- code会被直接插入
_jspService
方法中
例如:
可以用来:
- 设置response的header以及状态码
- 写日志或者更新数据库
- 反正就是走后台的都用这个
例如:
条件性生成html文件
Scriptlets会被按照书写的方式插入,静态的HTML文件插入out.println()
中。
条件性生成不同html的代码可以用JSP写成:
转换到_jspService()
中会是:
declarations
放在<%! code%>
中的代码会放在_jspService()
方法外
这些代码会被不同的request使用
例如:
如果想在scriptlet或者declaration中打%>
要使用\%\>
,转义确保有符号出来
预先定义好的变量
也称为隐式对象,它们用于简化JSP expression和scriptlets,不可以在 declarations 中使用
- request
- response
- out
- session
- config
- page
- application
- pageContext
例子:打印Request的信息
JSP指令
语法:
必须使用单引号或者双引号来赋值
有三种指令:page, include, taglib
- page: 用来导包
- include:用来插入其他的文件
- taglib:基本不用
导包
用<%@ page import = "..." >
实现,包名用**双引号包裹**
设置response header的content type
用<%@ page contentType = "..." >
实现
设置 session
用<%@ page session = "..." >
实现
- 创建新会话,将赋值设为
true
其余
JavaBean
JavaBeans是书写java类的一种标准
- 要在packet中书写,就是第一行要有
packet ...
- 全部涉及到直接引用变量的方法都是以
get
或者set
开头的 - 应该实现
Serializable
接口(其内无方法) - 无
main
方法 - 有无参构造器
- 全部的变量都应该是
private
的 - 对于非boolean的变量,都必须有
getXxx()
和setXxx()
方法。对于boolean变量,有isXxx()
和setXxx()
方法
如何书写JavaBean
- 写一个类,并implements Serializable接口
- 添加accessor和mutator(就是getter和setter)
- 编译并把其打包为JAR file
JSP中使用JavaBean
jsp:useBean
来在JSP中加载一个bean
意义为:实例化class指定的类的一个对象,并将其绑定到id指定的名称的变量
等价于:
访问JavaBean对象的属性
在 <jsp:useBean> </jsp:useBean>
标签主体中使用 <jsp:getProperty />
标签来调用 getter 方法,使用 <jsp:setProperty />
标签来调用 setter 方法,语法格式如下
<jsp:useBean id="id" class="bean 编译的类" scope="bean 作用域">
<jsp:setProperty name="bean 的 id" property="属性名"
value="value"/>
<jsp:getProperty name="bean 的 id" property="属性名"/>
...........
</jsp:useBean>
name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。
在JSP中使用一个JavaBean
语法注意点:
- 属性的名是大小写敏感的
- 全部的变量要用双引号包裹
- 要用
/>
结尾
使用方法:
- 使用
<jsp:useBean>
来定义一个新的 javabean,标记其id
与class
<jsp:setProperty>
中property
属性的值为等会赋的值
例子:
有两种访问变量的方式
<% bmi.getXxx %>
或者<% bmi.setXxx %>
- 使用 JSP 指令
在JSP中使用javaBean例子
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>get 和 set 属性实例</title>
</head>
<body>
<jsp:useBean id="students"
class="com.runoob.StudentsBean">
<jsp:setProperty name="students" property="firstName"
value="小强"/>
<jsp:setProperty name="students" property="lastName"
value="王"/>
<jsp:setProperty name="students" property="age"
value="10"/>
</jsp:useBean>
<p>学生名字:
<jsp:getProperty name="students" property="firstName"/>
</p>
<p>学生姓氏:
<jsp:getProperty name="students" property="lastName"/>
</p>
<p>学生年龄:
<jsp:getProperty name="students" property="age"/>
</p>
</body>
</html>
输出结果:
学生名字: 小强
学生姓氏: 王
学生年龄: 10
<jsp:setProperty>
用来设置已经实例化的Bean对象的属性
第一种形式
<jps:setProperty name = "JavaBean实例名" property = "*"/>
该形式是设置Bean 属性的快捷方式。在Bean 中属性的名字,类型必须和request对象中的参数名称相匹配。由于表单中传过来的数据类型都是String 类型的,Jsp内在机制会把这些参数转化成Bean属性对应的类型。
property = "*"
表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。
第二种形式
<jsp:setProperty name = "JavaBean实例名" property = "JavaBean属性名" />
使用request对象中的一个参数值来指定Bean中的一个属性值。
在这个语法中,property指定Bean 的属性名,而且Bean 属性名和request参数的名字应相同。也就是说,如果在Bean 中有setUserName(String userName)
方法,那么,propertyName
的值就是"userName"
。这种形式灵活性较强,可以有选择的对Bean中的属性赋值。
第三种形式
<jsp:setProperty name = "JavaBean实例名" property = "JavaBean属性名" value = "BeanValue"/>
value用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。
第四种形式
<jsp:setProperty name = "JavaBean实例名"
property = "propertyName" param = "request对象中的参数名"
/>
param
指定用哪个请求参数作为Bean属性的值。
Bean 属性和request参数的名字可以不同。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。
例如,下面的代码片断表示:如果存在numItems
请求参数的话,把numberOfItems
属性的值设置为请求参数numItems
的值;否则什么也不做。
<jsp:setProperty name="orderBean" property="numberOfItems" param="numItems" />
Bean的范围
jsp.useBean
创造了新的一个bean对象
-
实际上,这声明了一个bean的范围
<jsp:useBean id=“bean1” class=“BMIBean” scope=“page” />
如果在指定的范围内已经存在同名的bean,则该变量将被绑定到现有的bean上;否则将创建一个新的
错误处理
JSP中使用Error pages
用 error page 来处理除法中除了0的情况
- 出现错误之后会导向Error Page
HTML
导向error page
没有错误的原JSP
- 要设置
<%@ page errorPage="BMIError.jsp" %>
JavaBean 假设Setter缺失
设置某页面为error page
Error Page
- 设置
<%@ page isErrorPage=“true” %>
结果: 会导向Error Page
造成这样的原因:
- 缺失了
setHeight()
方法时,height不会在request中设置
JSP中引入文件
有两种方法引用其他文件
- 使用
include
指令- 可以在Translation时引入其他 JSP 文件
- 如果被引用的文件变了,全部的JSP文件都要变
- 使用
jsp:include
action- 在 request 时包含静态的HTML文件或其他类型的文件
- 引用的文件可以被更改而不用从translating JSP
- 比较常用
使用include: ContactSection.jsp
使用 jsp:include action
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
What's New at JspNews.com
</TABLE>
</CENTER>
<P>Here is a summary of our four most recent news stories:
<OL>
<LI> <jsp:include page="news/Item1.htm" flush="true" />
<LI> <jsp:include page="news/Item2.htm" flush="true" />
<LI> <jsp:include page="news/Item3.htm" flush="true" />
<LI> <jsp:include page="news/Item4.htm" flush="true" />
</OL>
</BODY>
效果:
Redirecting & Forwarding
Forwarding requests from JSPs
JSPs 和 Servlets 都可以将request导向到其他的 JSPs或者Servlet
- JSP:使用
<jsp:forward page="url" />
- 三种方式
使用 forward 的 JSP 页面不能有任何的输出
- Servlet:创造一个
RequestDispatcher
对象
d = request.getRequestDispatcher("some path in server");
d.forward(request, response);
回顾RequestDispatcher
MVC Model View Controller
-
the servlet handles the HTTP protocol and coordination of which other servlets and auxiliary class method to call (controller)
-
Java classes/ JavaBeans handle the business logic (model)
-
Java Server Pages handle presentation logic (view)
M: Model, 业务模型,处理业务
V: View, 视图,界面展示
C: Controller, 控制器,处理请求,调用模型和视图
将servlet用于流程密集型任务,JSP用于表示,而JavaBeans对数据的逻辑行为进行建模。
三层架构
MVC优势与劣势
优势:
- 对大型的应用来说,允许重复使用软件component,容易维护
劣势:
- 如果controller的代码改了,需要重写编译和部署(recompile its code and redeploy)
JSP 与 JavaBean 在其中的用处
JSP for presentation
JavaBean model the logical behaviour of data
MVC 基本
用Servlet回复初始响应
- 调用提取或创建用户数据并将数据放入javabean中的代码
Servlet存储 JavaBean
- 基于请求的共享 —— 在Request对象中存储JavaBean
- 基于Session的共享 —— 在Session对象中存储JavaBean
- 基于应用的共享 —— 在ServletContext对象中存储JavaBean
Servlet forward request到新的JSP页面
- 展示结果,JSP页面从JavaBean中调取数据
JSPs 不会set数据,只会get
- It uses
jsp:getProperty
but notjsp:setProperty
导入 JavaBean
<%@ page import='chain.model.DataBean' %>
import
后要带**单引号*