实验预习内容
- 静态include指令何时执行?主页面和被包含的子页面是否转换为一个转换单元?
同一个转换单元的页面之间如何共享数据?
答:静态include指令是在JSP页面转换阶段执行。主页面和被包含的子页面转换为一个转换单元。同一个转换单元的页面之间通过隐含变量共享数据。 - jsp:include动作指令何时执行?主页面和被包含的子页面是否转换为一个转换单元?动作包含的子页面与主页面共享同一个请求吗?在不同的转换单元中如何进行数据的传递和共享?
答:jsp:include动作指令在JSP页面转换阶段执行。主页面和被包含的子页面不转换为一个转换单元。动作包含的子页面与主页面共享同一个请求。在不同的转换单元中通过请求作用域的对象或隐含变量进行数据的传递和共享。 - jsp:forward动作与jsp:include动作有什么相同点和不同点?与jsp:forward动作等价的其他两种写法如何表示?
答:相同点:都可以实现转换页面。不同点:jsp:forward动作在当转发到的页面处理完输出后,并不能控制转回主页面。而且主页面不能包含任何输出。 - 什么是JavaBeans?
答:JavaBeans是java平台的组件技术,在Java Web开发中常用JavaBeans来存放数据、封装业务逻辑等,从而很好地实现业务逻辑和表示逻辑的分离,使系统具有更好的健壮性和灵活性。对程序员来说,JavaBeans最大的好处是可以实现代码的重用,另外对程序的易维护性等也有很大的意义。 - 访问JavaBeans的三个JSP动作中jsp:useBean动作的常用属性有哪些?这些属性各有什么作用?
答 :jsp:useBean动作的常用属性有:id属性:用来唯一标识一个bean实例。scope属性:指定bean实例的作用域。class属性:指定创建bean实例的java类。type属性:指定由id属性声明的变量的类型。
实验内容及要求
- include静态指令的使用。
创建名称为exp03的Web项目,编写hello.jsp页面,其中声明一个变量userName,用于获取请求地址后查询串参数userName的值;使用<%@ include>静态指令包含response.jsp页面,通过response.jsp页面显示userName的值,用下面两种方法实现。执行代码并查看运行结果。
方法一:response.jsp页面中通过JSP表达式直接输出变量userName的值。
方法二:通过pageContext作用域属性,在主页面和子页面间共享userName的值,降低主页面和子页面的依赖性。
- hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
<%! String username;%>
<%@ include file="response.jsp"%>
</body>
</html>
- response.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>response</title>
</head>
<body>
<%--<% username=request.getParameter("username");%>--%>
<%--Hello,<%=username%><br/>--%>
<% pageContext.setAttribute("username",request.getParameter("username"),PageContext.REQUEST_SCOPE);%>
<%= pageContext.getAttribute("username",PageContext.REQUEST_SCOPE)%>
</body>
</html>
2. jsp:include动作指令的使用。
编写main.jsp页面,其中声明一个变量userName,用于获取请求地址后查询串参数userName的值;在main.jsp页面中使用jsp:include动作包含subpage.jsp页面,通过subpage.jsp页面显示userName的值;执行代码并查看运行结果。
- main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>main</title>
</head>
<body>
<%! String username;%>
<jsp:include page="subpage.jsp"></jsp:include>
</body>
</html>
- subpage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>subpage</title>
</head>
<body>
<% String username=(String)request.getParameter("username");%>
<%= username %>
</body>
</html>
3. jsp:useBean、jsp:setProperty、jsp:getProperty动作的使用
从HTML页面login.html中输入用户名和口令等,然后提交给display. jsp页面,在该页面中通过JavaBeans保存数据并输出。
【步骤1】创建UserBean.java,包含username, password, email三个私有数据成员和相应的访问器和设置器。
package com.example.exp03;
public class UserBean {
private String username;
private String password;
private String email;
public UserBean(){
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public UserBean(String username,String password,String email){
this.username=username;
this.password=password;
this.email=email;
}
}
【步骤2】编写登录页面login.html,部分代码如下,补充关键代码:
<html>
<body>
Please input:<br>
<form action="display.jsp" method="post">
UserName:<input type="text" name="username"><br>
Password:<input type="password" name="password"><br>
Email:<input type="text"name="email"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
Please input:<br>
<form action="display.jsp" method="post">
UserName:<input type="text" name="username"><br>
Password:<input type="password" name="password"><br>
Email:<input type="text"name="email"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
【步骤3】编写display.jsp页面,使用JavaBeans显示输入的信息,部分代码如下,补充关键代码:
<%@ page import="com.beans.UserBean" %>
<jsp:useBean id="user" class= "UserBean">
<jsp:setProperty name="user" property="*"/>
</jsp:useBean>
<html>
<body>
UserName:<jsp:getProperty name="user" property="username"/><br>
Password:<jsp:getProperty name="name" property="password"/> <br>
Email:<jsp:getProperty name="user" property="email"/> <br>
</body>
</html>
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<%@ page import="com.example.exp03.UserBean" %>
<jsp:useBean id="user" class="com.example.exp03.UserBean">
<jsp:setProperty name="user" property="*"/>
</jsp:useBean>
<html>
<head>
<title>display</title>
</head>
<body>
UserName:<jsp:getProperty name="user" property="username"/><br>
Password:<jsp:getProperty name="user" property="password"/><br>
Email:<jsp:getProperty name="user" property="email"/><br>
</body>
</html>
- 使用JavaBean构造一个简单的计算器,能够进行“+、—、*、/”运算。
【步骤1】编写实现简单计算器的JavaBean:SimpleCalculator.java,包含first、second、operator、result四个成员变量和相应的访问器与设置器,一个calculator方法根据运算符获取运算结果。
【步骤2】编写calculate.jsp页面,用户通过表单输入两个操作数和运算符,调用该页面自身处理该表单,通过调用SimpleCalculator类的实例实现运算逻辑,并显示运算结果。
public class SimpleCalculator {
private float first;
private float second;
private String operator;
private float result;
public float getFirst() {
return first;
}
public void setFirst(float first) {
this.first = first;
}
public float getSecond() {
return second;
}
public void setSecond(float second) {
this.second = second;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public float getResult() {
return result;
}
public void setResult(float result) {
this.result = result;
}
public float calculate(float first,float second,String operator){
switch (operator){
case "+":result=first+second;break;
case "-":result=first-second;break;
case "*":result=first*second;break;
case "/":result=first/second;break;
default:break;
}
return result;
}
public SimpleCalculator(float first,float second,String operator,float result){
this.first=first;
this.second=second;
this.operator=operator;
this.result=result;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="cal" class="SimpleCalculator">
<jsp:setProperty name="cal" property="*"/>
</jsp:useBean>
<html>
<head>
<title>calculate</title>
</head>
<body>
<form action="calculate.jsp" method="post">
<input type="text" name="first">
<select name="operate">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" name="second">=
<%
try{
float first= cal.getFirst();
float second= cal.getSecond();
String op = cal.getOperator();
float result= cal.calculate(first,second,op);
out.print(result);
}catch (Exception e){
e.printStackTrace();
}
%>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
思考题
- 什么是Model 1体系结构,有何缺点?
答:model1体系每个请求的目标都是jsp页面。Jsp页面负责完成所有任务并将响应发送给客户。缺点:①特需要将大量的Java代码的业务逻辑嵌入到jsp页面中;②不能提高组件的可重用性。 - 什么是MVC设计模式?其优点是什么?
答:将web应用组件分成模型、控制器、视图三部分,每种组件完成各自的任务,该结构的所有请求目标都是servlet,充当控制器,servlet分析请求并将所需要的数据收集到JavaBean对象,该对象作为模型,最后servlet将请求转发到jsp,有jsp调用JavaBean中的数据并产生响应。 - 实现MVC设计模式的一般步骤是什么?
答:(1)定义JavaBeans存储数据;
(2)使用Servlet处理请求;
(3)结果与存储;
(4)转发请求到JSP页面;
(5)从JavaBeans对象中提取数据。