【高编 6】 北邮 高级网络程序设计 6. JSP&JavaBean

JSP

Java Server Page

JSP脚本

三者有很严格的区分

expression: <%... %>:内容会直接放到_jspService()方法里

scriptlet:<%=... %>:内容会放到out.print()中,作为out.print()的参数

declaration: <%!... %>:内容会放到_jspService()方法之外,被类直接包含

directives: <%@ ... %>:用来导包等,主要写import方法

为什么使用 JSP

允许静态的HTML网页受Servlet控制下的动态修改

image-20211204154725730

JSP的优势

image-20211204154735286

image-20211204154744880

JSP其实是Servlet

image-20211204154852607

index.jsp => index.jsp.java => index.jsp.class (Servlet)

JSP如何创造Servlet

JSP中的html部分以及java部分代码都会放到void _jspService()方法中

例如:

image-20211204155040394

JSP 更改方法

三个方法:

  • jspInit()
  • _jspService()
  • jspDestroy()

image-20211225213622457

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方法中

例如:

image-20211204155729032

可以用来:

  • 设置response的header以及状态码
  • 写日志或者更新数据库
  • 反正就是走后台的都用这个

例如:

image-20211204155923545

条件性生成html文件

Scriptlets会被按照书写的方式插入,静态的HTML文件插入out.println()中。

条件性生成不同html的代码可以用JSP写成:

image-20211204160120703

转换到_jspService()中会是:

image-20211204160140927

declarations

放在<%! code%>中的代码会放在_jspService()方法外

这些代码会被不同的request使用

例如:

image-20211204160317808

如果想在scriptlet或者declaration中打%>要使用\%\>转义确保有符号出来

预先定义好的变量

也称为隐式对象,它们用于简化JSP expressionscriptlets不可以在 declarations 中使用

  • request
  • response
  • out
  • session
  • config
  • page
  • application
  • pageContext

image-20211204160550675

image-20211204160719205

image-20211204160734439

例子:打印Request的信息

image-20211204161813408

image-20211204161818908

image-20211204161824358

image-20211204161829391

JSP指令

语法:

必须使用单引号或者双引号来赋值

image-20211204161855204

有三种指令:page, include, taglib

  • page: 用来导包
  • include:用来插入其他的文件
  • taglib:基本不用

导包

<%@ page import = "..." > 实现,包名用**双引号包裹**

image-20211204162105131

设置response header的content type

<%@ page contentType = "..." > 实现

image-20211204162127640

设置 session

<%@ page session = "..." > 实现

  • 创建新会话,将赋值设为true

image-20211204162207091

其余

image-20211204162311323

image-20211204162318826

JavaBean

JavaBeans是书写java类的一种标准

  • 要在packet中书写,就是第一行要有packet ...
  • 全部涉及到直接引用变量的方法都是以get或者set开头的
  • 应该实现Serializable接口(其内无方法)
  • main方法
  • 有无参构造器
  • 全部的变量都应该是private
  • 对于非boolean的变量,都必须有getXxx()setXxx()方法。对于boolean变量,有isXxx()setXxx()方法

如何书写JavaBean

  1. 写一个类,并implements Serializable接口
  2. 添加accessormutator(就是getter和setter)
  3. 编译并把其打包为JAR file

JSP中使用JavaBean

jsp:useBean 来在JSP中加载一个bean

image-20211204162950921

意义为:实例化class指定的类的一个对象,并将其绑定到id指定的名称的变量

image-20211204163029340

等价于:

image-20211204163040528

访问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

语法注意点:

  • 属性的名是大小写敏感的
  • 全部的变量要用双引号包裹
  • 要用/>结尾

使用方法:

  1. 使用<jsp:useBean> 来定义一个新的 javabean,标记其idclass
  2. <jsp:setProperty>property属性的值为等会赋的值

image-20211204163150341

例子:

有两种访问变量的方式

  • <% 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上;否则将创建一个新的

image-20211204164840107

错误处理

JSP中使用Error pages

用 error page 来处理除法中除了0的情况

  • 出现错误之后会导向Error Page

image-20211204170056336

HTML

image-20211204172912239

导向error page

没有错误的原JSP

  • 要设置<%@ page errorPage="BMIError.jsp" %>

image-20211204173035924

JavaBean 假设Setter缺失

image-20211204173115664

设置某页面为error page

Error Page

  • 设置<%@ page isErrorPage=“true” %>

image-20211204173139877


结果: 会导向Error Page

image-20211204173256306


造成这样的原因:

  • 缺失了setHeight()方法时,height不会在request中设置

image-20211204173330384

JSP中引入文件

有两种方法引用其他文件

  • 使用include指令
    • 可以在Translation时引入其他 JSP 文件
    • 如果被引用的文件变了,全部的JSP文件都要变
  • 使用jsp:include action
    • 在 request 时包含静态的HTML文件或其他类型的文件
    • 引用的文件可以被更改而不用从translating JSP
    • 比较常用

使用include: ContactSection.jsp

image-20211204174018514

image-20211204174028093

使用 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>

效果:

image-20211204174522117

Redirecting & Forwarding

image-20211204174645268

Forwarding requests from JSPs

JSPs 和 Servlets 都可以将request导向到其他的 JSPs或者Servlet

  • JSP:使用 <jsp:forward page="url" />
    • 三种方式

image-20211204174805848

使用 forward 的 JSP 页面不能有任何的输出

  • Servlet:创造一个RequestDispatcher 对象
  1. d = request.getRequestDispatcher("some path in server");
  2. d.forward(request, response);

回顾RequestDispatcher

image-20211204175139541

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, 控制器,处理请求,调用模型和视图

image-20211208124849589

将servlet用于流程密集型任务,JSP用于表示,而JavaBeans对数据的逻辑行为进行建模。

三层架构

image-20211226175149851

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 not jsp:setProperty

导入 JavaBean

<%@ page import='chain.model.DataBean' %>

import后要带**单引号*

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这不是Ourz的ID

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值