JAVAWEB大作业报告书及源码——基于 Struts 的图书管理系统
本网站是个人网站,设计目的展现个人风采,设计风格是根据个人喜好设计,简约唯美的风格图片以及图标现个人特色。主要功能要注册登录、个人简介、个人爱好、个人收藏、留言管理,完善个人信息等功能模块
其他主要模块的定义
- 素材的创作与编辑
网站图片来源:wps画报,百度,web实验,表情包图片
音乐:酷狗音乐下载,通过audacity剪辑其中部分
- 开发环境及使用技术
开发环境搭建
Myeclipse2018和mysql和navicat for mysql(可视化mysql工具)
运行工具
2345加速浏览器(IE模式 超速模式) chrome浏览器均可运行
使用主要技术
- 前端采用HTML+CSS+JavaScript+bootsrap实现。
javaScript技术:表单验证关键字,滚动字幕 逐字显示(index2.jsp),显示日期时间JavaScript HTML DOM 事件(collection.jsp index.jsp等)
Boostrap实现响应式布局
(2)作品后端要求采用JSP、JavaBean、Servlet以及数据库等技术实现
JSP内置对象:本网站主要运用了 request, response, session三个。request主要用来获取用户输入的基本信息以及具体页面进行的操作中需要的数据。利用response来进行重定向,以及实现目的页面跳转用法为 response.setHeader(\”refresh\”,\”刷新时间间隔;目的页面地址\”);
验证码技术的使用:避免重复登录。是服务器随机产生验证码字符串,保存在session中,并写入图片,将图片连同表单发给客户端。用户输入账号密码验证码,将获取的验证码与随机产生的验证码进行比较,相同则继续进行,不同将错误信息返回客户端,避免程序的继续运行。
JavaBean:将用户登录的信息封装在JavaBean中,在需要时从JavaBean中读出。DAO本次主要用CustomerDao.java链接数据库 ,获得数据库里用户的密码
servlet这里主要用的是doGet()和doPost()。本实例主要用来验证验证码是否准确。以及使用Filter来解决常常会出现中文乱码情况。ftz.java:该页面用于防止用户绕过登录直接跳转到其他页面进行操作。该页面主要用了Filter过滤器来实现防止跳转的功能。该过滤器进行跳转页面之前进行判断是否有用户名,若有用户名则代表用户进行登录操作,过滤器放行;若用户名为NULL,则过滤器不放行,直接跳转到登录页面。
Ajax用于网页的异步刷新和只刷新网页的一小部分,可以带来更好的用户体验,减轻服务器负担,
MYSQL数据库:用JDBC将JAVAWEB和数据库连接,在数据库中创建一个用户登录信息表来判断是否存在该登录用户以及实现用户注册功能。
- 功能实现
数据库设计 用户密码表和留言信息表
目录
1.前言 3
- 实验目的 3
- 实验的基本要求 ..3
- 系统分析与设计 ..3
- 系统功能描述(简单需求分析) ..3
- 系统功能流程 ..3
- 数据库设计 4
- 数据表的构建 ..4
3.系统的实现与测试 ..5
- 系统采用的关键技术 ..5
- 关键程序流程 ..6
- 关键代码分析 ..7
- 出现的问题及解决 ..18
- 向数据库中插入数据出现乱码以及界面显示有中文乱码问题: 18
- 弹出提示框问题 ..19
- 系统界面 19
- 进入系统界面 (登录界面) ..19
- 管理员模块界面: ..19
- 添加图书界面: ..20
- 罚金设置界面: ..20
- 用户管理界面: ..20
- 用户模块界面: ..21
- 图书检索、借阅界面: ..21
- 续借图书界面: ..22
- 归还界面: ..22
- 安全退出界面: ..23
5.操作方法 23
- 登录 23
- 图书检索,借阅 ..23
- 图书归还,续借 ..23
- 图书,用户的添加 ..23
- 图书,用户的删除操作 ..24
- 图书,用户的更新操作 ..24
6.分析与总结 24
- 实验分析与总结 ..24
- 附录: 25
7.1 参考文献: ..25
- MVC 架构模式的认识 ..25
- / 27
南昌大学软件学院 java web 大作业 实验报告
1.前言
- 实验目的学习 Web应用程序的开发,以 B/S方式, JSP编程技术开发图书管理系统;通过编程实践掌握 JSP的动态网页与 sql2012 数据库相结合的技术;通过 MVC(模型 -视图-控制 )架构模式,使其在开发过程中得以应用,并了解 Web 编程模式下的 Model1 和 Model2 的区别;了解 Struts 框架的具体含义及在 Struts 模式下的开发。
- 实验的基本要求数据库表不少于 3 个,且表之间必须存在关联。页面设计布局合理,颜色使用恰当,风格统一,页面应不少于 10 个。系统功能不少于 6 个,且能正确运行。系统采用面向对象的方式设计,尽量使界面、业务、数据之间的耦合关系降低。代码实现尽量使用事件处理、事务处理。系统应对一些常见的异常进行适当的处理。数据的操作以事务的方式实现,要求处理并发问题。
- 系统分析与设计
- 系统功能描述(简单需求分析)图书管理系统是典型的信息管理系统 (MIS),本系统是根据现代化校园的发展而设计的基于 jsp的图书管理系统,本系统就是为了管理好图书信息和借阅等一系列操作而设计的。图书管理系统需要满足来自两方面的需求, 这三个方面分别是学生和管理员。 学生的需求是查询图书馆的藏书,借阅图书,和退换图书等功能;管理员的功能最为复杂,包括对学生、图书进行管理,及系统状态的查看、维护并。学生要使用图书管理系统,需要进行登陆,登陆之后则可以进行一系列的操作,例如:查询图书,借阅图书,归还图书等功能。而作为管理员,则可以对学生进行添加,只有已添加有卡号的学生才可以进行图书管理系统的登陆,管理员还可以对图书进行增,删,改,查。亦可以对用户进行增,删,改查等功能。
- 系统功能流程
为了满足以上的需求,系统分成了两大模块,普通用户模块和管理员模块。
- / 27
南昌大学软件学院 java web 大作业 实验报告
功能模块图如图所示。
相应 Struts 页面流程如下所示(电子版可自行放大) :
- 数据库设计
- 数据表的构建
本系统采用如下的数据表:
用户信息表 users:用于记录用户信息数据表
- / 27
南昌大学软件学院 java web 大作业 实验报告
字段名 类型 长度 是否为主键 可否为空 说明
ID nchar 10 是 否 用户 ID
username nchar 10 否 否 用户姓名
password nchar 10
cardnum int 10
否 否 用户密码
否 否 卡号信息
userlevel int 10 否 否 用户级别
coater int 10 否 否 借阅限额
borrowed int 10 否 否 已借阅数
can_borrow int 10 否 否 可借阅数
图书信息表 books: (用于存储图书相关信息 )
字段名 类型 长度 是否为主键 可否为空 说明
b_ID int 10 是 否 图书 ID
b_name nvarchar 50 否 否 图书名称
b_author nchar 10 否 否 图书作者
b_publish nvarchar 50 否 否 图书出版社
b_type nchar 10 否 否 图书类型
b_count int 10
b_hot int 10
借阅表 borrowbook: ( 用于表示借阅信息 )
否 否 拥有数量
否 否 欢迎度
字段名 类型 长度 是否为主键 可否为空 说明
brid int 10 是 否 借阅表 id
cardnum int 10 是 否 用户表外键
b_ID int 10 是 否 图书表外键
borrowday nchar 10 否 否 借阅日期
shouldreturn nchar 10 否 否 应还日期
罚金表 fine: (用于设置罚金 )
字段名 类型 长度 是否为主键 可否为空 说明
fine float 10 是 否 罚金
3.系统的实现与测试
3.1 系统采用的关键技术
本系统采用的是 Model2 模型,Model2 表示的是基于 MVC模式的框架。MVC是 Model-View
-Controller 的简写。 \”Model\” 代表的是应用的业务逻辑(通过 JavaBean,), \”View\” 是应
用的表示面(由 JSP页面产生) ,\”Controller\” 是提供应用的处理过程控制(一般是一个
Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些
组件可以进行交互和重用。从而弥补了 Model1 的不足。
- / 27
南昌大学软件学院 java web 大作业 实验报告
Model2 具有组件化的优点从而更易于实现对大规模系统的开发和管理, 但是开发 MVC系统
比简单的 JSP开发要复杂许多, 它需要更多的时间学习和掌握。 同时新东西的引入会带来新
的问题(这让我想起来关于 \”自动计算 \”的一篇文章,中间提到为了降低系统的复杂度,却导
致更高的复杂度) 。必须基于 MVC组件的方式重新思考和设计应用结构。 原来通过建立一个
简单的 JSP页面就能实现的应用现在变成了多个步骤的设计和实现过程。 所有的页面和组
件必须在 MVC 框架中实现,所以必须进行附加地开发工作。 MVC 本身就是一个非常复杂
的系统,所以采用 MVC 实现 Web 应用时,最好选一个现成的 MVC框架,在此之下进行开
发,从而取得事半功倍的效果。现在有很多可供使用的 MVC 框架,由于 Struts 有完整的文
档并且相对来讲比较简单,所以用它开发 MVC 系统还是比较方便地。
3.2 关键程序流程
本实验的总体流程如下:
本系统应用 3 层架构模型,现分别对其进行阐述:
第一层架构为数据库层,也是程序的最底层 (主要由 DataBase.java 实现 ),它的功能实现
sql2012 数据库的连接,函数里封装了几个操作。
public boolean query(String s) ( 用于查询数据表操作 );
public ResultSet getlist(String s) (用于获取数据的可以滚动结果集 ) ;
public int update(String s) (用于简单的数据更新操作)
public boolean executebatch(String a[]) (批处理,用于处理多条 sql);
第二层为 JavaBean层和 DAO层,主要实现对数据表的信息及对其进行操作的信息进行封装
(主要 由文 件 Books.java、 Fine.java、 borrowbook.java 、 Users.java、BookService.java 、borrowbookSevice.java、FineService.java 和 UserService.java 来实现的)。在相应的 JavaBean
层封装了所有数据表的信息,在上述的实体类中 (Books.java、Fine.java、borrowbook.java 、
Users.java)仅包含对属性的 set和 get 方法,在相应的 DAO层主要包含对数据表的相关操作,
如获得该数据表的全部信息或部分信息,增加、删除、修改、查询相应的数据表;
第三层为业务逻辑层, 主要由 Struts 和其的 action 来实现, 实现页面的控制和跳转到相应的
jsp 页面,其中 action 主要包括 BooksAction.java、LoginAction.java、ResetfineAction.java、UserAction.java。
- / 27
南昌大学软件学院 java web 大作业 实验报告
相应的程序架构如图所示:
- 关键代码分析
数据库的连接和相关一些操作函数 (在文件 DataBase.java中实现的 ):
package com.wk.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DataBase {
private Connection conn = null;
private Statement stmt;
ResultSet rs = null;
// 数据库的 url
- / 27
南昌大学软件学院 java web 大作业 实验报告
private String url = \”jdbc:sqlserver://localhost:1433;DatabaseName=Book\”;
// 数据库的用户名密码
String user = \”sa\”;
String pass = \”123\”;
// 用于验证查询操作
public boolean query(String s) throws SQLException{
try{
// 加载驱动
Class.forName(\”com.microsoft.sqlserver.jdbc.SQLServerDriver\”);
}catch(ClassNotFoundException e){
System.out.println(\”加载驱动器类时异常 \”);
}
try{
// 创建链接
conn = DriverManager.getConnection(url, user, pass); stmt = conn.createStatement();
rs = stmt.executeQuery(s);
}catch(SQLException e){
System.out.println(\”query 连接数据库的过程中出现 SQL异常 <br>\”);
}
return(rs.next());
}
// 用于结果集可滚动的操作
public ResultSet getlist(String s) throws SQLException{
try{
- / 27南昌大学软件学院 java web 大作业 实验报告
// 加载驱动Class.forName(\”com.microsoft.sqlserver.jdbc.SQLServerDriver\”);}catch(ClassNotFoundException e){System.out.println(\”加载驱动器类时异常 \”);}try{// 建立连接conn = DriverManager.getConnection(url, user, pass);// 得到 statement 对象stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);// 得到一个可滚动但不可以更新的结果集 rsrs = stmt.executeQuery(s);}catch(SQLException e){System.out.println(\”更新操作连接数据库的过程中出现 SQL异常<br>\”);}return rs;}// 用于对数据库的更新public int update(String s) throws SQLException{int msg=0;try{// 加载驱动Class.forName(\”com.microsoft.sqlserver.jdbc.SQLServerDriver\”);}catch(ClassNotFoundException e){System.out.println(\”加载驱动器类时异常 \”);
- / 27南昌大学软件学院 java web 大作业 实验报告
}try{// 创建链接conn = DriverManager.getConnection(url, user, pass); stmt = conn.createStatement();msg = stmt.executeUpdate(s);}catch(SQLException e){System.out.println(\”连接数据库的过程中出现 SQL异常 <br>\”);}return(msg);}// 批处理,用于处理多条 sqlpublic boolean executebatch(String a[]){try {// 创建链接conn = DriverManager.getConnection(url, user, pass); conn.setAutoCommit(false);//关闭自动提交,进行事物处理 stmt = conn.createStatement();for(int i=0;i<a.length;i++){stmt.addBatch(a[i]);}int [] number = stmt.executeBatch();// 开始批处理,返回被执行的 sql 语句的序号conn.commit();System.out.println(\”共有 \”+number.length+\”条 sql语句被执行 \”); stmt.clearBatch();//清空 batchconn.close();return true;
- / 27南昌大学软件学院 java web 大作业 实验报告
} catch (SQLException e) {// TODO Auto-generated catch block try {conn.rollback();return false;} catch (SQLException e1) {// TODO Auto-generated catch block e1.printStackTrace();}e.printStackTrace();}return false;}// 关闭数据流public void close() throws SQLException{conn.close();stmt.close();rs.close();}}管理员操作用户 (在文件 UserService.java 中实现的 )// 管理员对用户的添加操作public boolean adduser(String a[]) throws SQLException{// 将密码明文转换为密文存入数据库a[2] = ead.encrypt(a[2]);// 利用字符串的拼接组成 sql语句
- / 27南昌大学软件学院 java web 大作业 实验报告
sql = \”insert into usersvalues(\’\”+a[0]+\”\’,\’\”+a[1]+\”\’,\’\”+a[2]+\”\’,\”+a[3]+\”,\”+a[4]+\”,\”+a[5]+\”,\”+a[6]+\”)\”;System.out.println(\”添加的 sql\”+sql);// 调用数据库的更新数据的操作函数int result = db.update(sql);if(result!=0)return true;return false;}// 管理员对用户的删除操作public boolean deluser(String id) throws SQLException{sql = \”delete from users where ID=\’\”+id+\”\’\”;System.out.println(\”del sql=\”+sql);int result = db.update(sql);if(result!=0)return true;return false;}// 管理员对用户的更新操作public boolean updateusers(String a[]) throws SQLException{sql = \”update users set username=\’\”+a[1]+\”\’,userlevel=\”+a[2]+\” where ID=\’\”+a[0]+\”\’\”;System.out.println(\”更新 sql=\”+sql);int result = db.update(sql);if(result!=0)return true;return false;}这里管理员对图书的操作和对用户的操作很类似,这里就不再赘述了。用户对图书的查询,借阅和续借和归还 (主要在 BooksService.java 和borrowbookService.java 实现的)BooksService.java 部分代码:/ /模糊查询,获取用户的关键词,以此为查询条件进行搜索,默认按人气高至低排列public ArrayList getbook(String a[]) throws SQLException{ArrayList al = new ArrayList();
- / 27南昌大学软件学院 java web 大作业 实验报告
for(int i=0;i<a.length;i++){System.out.println(a[i]);}if(a[0].equals(\”\”)){sql = \”select * from books where \”+a[2]+\” LIKE \’%\”+a[1]+\”%\’ order by b_hot desc\”;}else{sql = \”select * from books where \”+a[2]+\” LIKE \’%\”+a[0]+\”%\’ order by b_hot desc\”;}System.out.println(\”sql:\”+sql);// 调用 DataBase.java的函数,获取相应的图书列表rs = db.getlist(sql);while (rs.next()) {Books bk = new Books();bk.setB_ID(rs.getInt(1)); bk.setB_name(rs.getString(2));bk.setB_author(rs.getString(3));bk.setB_publish(rs.getString(4));bk.setB_type(rs.getString(5)); bk.setB_count(rs.getInt(6));bk.setB_hot(rs.getInt(7));al.add(bk); // 将al放到 arrayList中}return al;}borrowbookService.java 部分代码:// 归还图书,public boolean returnbook(String brid,String cardnum,String b_ID) throws SQLException{String sql1 = \”update users set borrowed = borrowed-1 , can_borrow =can_borrow+1 where cardnum = \”+cardnum;String sql2 = \”update books set b_count = b_count+1 where b_ID=\”+b_ID;String sql3 = \”delete from borrowbook where brid=\”+brid; String a[] = {sql1,sql2,sql3};// 处理多条语句时,使用事务处理和使用批处理进行处理。if(db.executebatch(a))return true;return false;}// 续借图书
- / 27南昌大学软件学院 java web 大作业 实验报告
public boolean renewbook(String brid) throws SQLException{// 将当前时间获得,拼接之 sql,进行数据库表的更新操作sql = \”update borrowbook set borrowday =\’\”+newDay().getnowdate()+\”\’,shouldreturn = \’\”+new Day().getdate()+\”\’ where brid=\”+brid;System.out.println(\”sql=\”+sql);int r = db.update(sql);if(r!=0){return true;}return false;}管理员对罚金的设置(主要由 FineService.java和Resetfine.java完成的)FineService.java代码:package com.wk.service;import java.sql.ResultSet;import java.sql.SQLException;import com.wk.util.DataBase;public class FineService {DataBase db = new DataBase();ResultSet rs = null;String sql = \”\”;// 管理员设定罚金金额public boolean setfine(float f){// 字符拼接将设置的金额拼接成 sqlsql = \”update fine set fine =\”+f; System.out.println(sql);try {// 调用 database.java的更新函数进行数据库操作int r = db.update(sql);if(r!=0){System.out.println(\”设置罚金成功! \”); return true;}else{System.out.println(\”设置罚金失败! \”);}} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();}
- / 27南昌大学软件学院 java web 大作业 实验报告
return false;}// 获取上一次设定的罚金金额public float getlastfine(){float m = 0;sql = \”select fine from fine\”;try {// 获取当前设定的金额rs = db.getlist(sql);while(rs.next()){m = rs.getFloat(1);}} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();}return m;}}Resetfine.java部分代码:// 设置罚金if(\”y\”.equals(isfirst)){f.setFine(fs.getlastfine()); request.setAttribute(\”oldfine\”, f.getFine());return mapping.findForward(\”success\”);}else{f.setFine(fs.getlastfine()); System.out.println(\”oldfine=\”+f.getFine());request.setAttribute(\”oldfine\”, f.getFine());// 获取表单输入的罚金金额,转为 float类型fs.setfine(Float.parseFloat(fineForm.getFine()));f.setFine(fs.getlastfine());System.out.println(\”newfine=\”+f.getFine()); request.setAttribute(\”newfine\”, f.getFine());// 跳转至成功界面return mapping.findForward(\”success\”);}
- / 27南昌大学软件学院 java web 大作业 实验报告
辅助工具包(实现用户密码的加密和时间的计算转换问题)Day.java/** 换算时间* 计算两个日期之间相差的天数* 计算一个日期在 n天之后的日期字符串*/package com.wk.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class Day {// 传入两个时间字符串,计算其中相差的天数public int getlaterday(String d1,String d2) throws ParseException{Date a = new SimpleDateFormat(\”yyyy-MM-dd\”).parse(d1); Date b = new SimpleDateFormat(\”yyyy-MM-dd\”).parse(d2);// 获取相减后天数long day = (a.getTime()-b.getTime())/(24*60*60*1000);System.out.println(day+\”\”);return (int) day;}// 获取两个月后时间字符串public String getdate(){SimpleDateFormat formatDate = new SimpleDateFormat(\”yyyy-MM-dd\”);// 字符串转换Calendar c = Calendar.getInstance();//new Date().getTime(); 这个是获得当前电脑的时间,你也可以换成一个 随意的时间c.setTimeInMillis(new Date().getTime());c.add(Calendar.DATE, 60);//天后的日期Date date= new Date(c.getTimeInMillis()); // 将c转换成 DateSystem.out.println(\”date=\”+formatDate.format(date)); return formatDate.format(date);}// 获取当前的时间
- / 27南昌大学软件学院 java web 大作业 实验报告
public String getnowdate(){Date dt=new Date();SimpleDateFormat matter1=new SimpleDateFormat(\”yyyy-MM-dd\”);System.out.println(matter1.format(dt)); return matter1.format(dt);}}EncryptAndDecrypt.javapackage com.wk.util;public class EncryptAndDecrypt {/*** 加密String明文输入 ,String密文输出** @param* @return*/public String encrypt(String sourceString){char [] p = \”图书管理 \”.toCharArray();int n = p.length;char [] c = sourceString.toCharArray();int m = c.length;for(int k = 0;k<m;k++){int mima = c[k]+p[k%n];c[k] = (char)mima;//加密}return new String (c);//返回密文}/*** 输入加密后的 String,返回原本的 String** @param* @return*/public String decrypt(String sourceString){char [] p = \”图书管理 \”.toCharArray();int n = p.length;
- / 27
南昌大学软件学院 java web 大作业 实验报告
char [] c = sourceString.toCharArray();
int m = c.length;
for(int k = 0;k<m;k++){
int mima = c[k]-p[k%n];
c[k] = (char)mima;//解密
}
return new String (c);//返回明文
}
}
- 出现的问题及解决
- 向数据库中插入数据出现乱码以及界面显示有中文乱
码问题:
问题描述: 当需要将数据插入数据库时, 会发现插入的数据有乱码。 在界面的表单进行数据输入时,传出传入的中文数据也会出现乱码。
1、JSP显示中文乱码的问题,一般都是没有设置页面编码,注意添加以下这样一段代码
<%@ page pageEncoding= ”-U8TF%>
”
<%@ page language=\”java\” contentType=\”text/html; charset=UTF-8\”%>
\”pageEncoding\”指定了当前 jsp文件存储使用的编码方式, “contentType用来”指定响应头消息
中的 \”Content-Type\”
当服务端的响应头消息中没有指定 charset 时,客户端会依据上面代码中的 charset 指定的编
码方式解码页面。
<meta http-equiv=\”Content-Type\” content=\”text/html; charset=UTF-8\” />
并且 JSP都以 UTF-8的编码方式保存, 把所有可能出现的问题通通抹杀。 http://www.linuxidc.com 如
果你使用 Myeclipse,可以设置 Myeclipse 的默认参数,使 Myeclipse 新建 JSP文件时,可以
自 动 是 用 UTF-8 的 编 码 方 式 。 方 法 : Windows-Preference-Myeclipse-File and
Editor-JSP-Encoding,选择 ISO 10646/Unicode(UTF-8)。
2、从表单获取的数据有中文乱码,在 Struts 里面,一般都使用过滤器进行数据的过滤,保
证数据的编码格式与你自己页面设置的一致。关键代码如下:
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
// 这里设置接受编码
arg0.setCharacterEncoding(\”utf-8\”);
// 继续让它前进,这句话必须要有
arg2.doFilter(arg0, arg1);
}
值得一提的是, arg0.doFilter(arg0,arg1); 这句话一定要有, 不然过滤器不会向前执行, 会停止 不前,这样程序就没法运行了!
- / 27南昌大学软件学院 java web 大作业 实验报告
3、读取数据时,在 Servlet 中添加 request.setCharacterEncoding(\”UTF-8\”); 可以很好地解决从JSP页面接受中文参数乱码。
- 弹出提示框问题问题描述:由于对 Struts 还不是完全的熟悉,对于其该怎样使用弹出框还是有点困扰,其不能再 action 里弹出一个弹出框后再进行 return mapping 的操作,这样写并不会有提示框,而是直接执行了 return mapping 语句。解决方法:使用 servlet 和 jsp结合来弹出提示框,即在 servlet 里给 jsp 传递一个参数,然后在 jsp 里进行该参数的判断,然后根据判断结果看是否弹出提示框,因为在 jsp 里可以直接写 js代码,这样弹出框会方便很多,只要用 alert(“我是弹出框! ”);这一句就可以了。
- 系统界面
- 进入系统界面 (登录界面)
- 管理员模块界面:
- / 27
南昌大学软件学院 java web 大作业 实验报告
- 添加图书界面:
- 罚金设置界面:
- 用户管理界面:
- / 27
南昌大学软件学院 java web 大作业 实验报告
- 用户模块界面:
- 图书检索、借阅界面:
- / 27
南昌大学软件学院 java web 大作业 实验报告
- 续借图书界面:
- 归还界面:
- / 27
南昌大学软件学院 java web 大作业 实验报告
4.9 安全退出界面:
5.操作方法
- 登录首先,输入正确网址即可打开系统登录界面,输入正确账号密码,系统会根据账号的级别,相应的进入不同的操作界面。
- 图书检索,借阅登录成功,点击左侧导航栏的检索、 借阅,即可进入相应界面。 输入关键词,或选择类别,点击搜索,会出现相应内容。
- 图书归还,续借
登录成功后,点击左侧相应的归还或续借菜单,即可进入相关界面,点击归还或续借按钮即可完成操作。
- 图书,用户的添加
管理员界面,点击左侧菜单的添加用户和添加图书,输入相关信息,点击添加即可。
- / 27
南昌大学软件学院 java web 大作业 实验报告
- 图书,用户的删除操作管理员界面,点击左侧菜单的删除用户和删除图书,找到想要删除的用户或图书,当然也可以通过 id 号或卡号进行搜索,然后进行操作。
- 图书,用户的更新操作
管理员界面,点击左侧菜单的更新用户和更新图书,找到想要更新的用户或
图书,当然也可以通过 id 号或卡号进行搜索,然后在该用户的这一条记录的相
应位置填写修改后的数据(当然有些字段是不能修改的) ,点击更新按钮即可。
6.分析与总结
- 实验分析与总结
在这一节中,我主要讨论了两个问题,一个是系统的联机文档,另一个是系
统的测试,下面我们分别加以说明。 作为一个完整的系统, 联机文档是其中不可
缺少的部分也是相当重要的部分。 好的文档能够使用户快速了解并准确的使用系
统的各项功能。 减少误操作, 减少错误产生的可能, 这对用户和开发人员都有很多的好处。所以在开发本系统中, 也加入了不少的文档, 除了对于几大模块的详细说明外,对于易出错和不易操作的地方 (如多条件查询部分) 又作了详细的说明。
由于本身能力的局限性,所以做编写的代码,即使经过反复检查也难免出错
所以在本阶段力求使用有限的时间找出尽可能多的错误, 力求系统尽量正确。 我们在本系统的测试中使用了黑盒法 (即不关心程序内部的逻辑结构, 而是根据程序的功能来设计是检测) 请一位不熟悉本系统的人来进行随意性的操作, 打破习
惯的操作顺序,从中发现错误,在此阶段系统的大量错误得到了改正 .
信息管理系统所涉及的数据库设计的重要步骤加载测试。 加载测试工作贯穿于程序测试工作的全过程,整个录入、修改、查询、处理工作均可视为对数据库
的加载测试工作。 要设计出一个好的信息管理系统数据库, 除满足系统所要求的
功能外,还必须遵守下列原则: 1)基本表的个数越少越好。 2) 主键的个数越少越好。键是表间连接的工具,主键越少,表间的连接就越简单。 3)字段的个数越
少越好。 4) 所有基本表的设计均应尽量符合第三范式。数据库的设计中,如何
处理多对多的关系和如何设计主键, 是两个有着较大难度、需要重点考虑的问题。
最后,希望自己在以后的空闲时间,能将该系统逐渐完美,将 bugs一个一
个的消除,将界面重新设计,使其符合当代的审美潮流。
- / 27
南昌大学软件学院 java web 大作业 实验报告
- 附录:
7.1 参考文献:
[1]JSP 编程技巧 /清宏计算机工作室编著 . 北京:机械工业出版社, 2001.1
[2]JAVA EE工程实训教程 /朱俊炎,吴英培编著 .天津科学技术出版社 ., 2010.2 [3] 深入 JAVA Servlet 网络编程 . 清华大学出版社
[4]Struts 开发入门与项目实践 . 北京:人民邮电出版社 , 2005.8
[5]J2EE 应用开发实例精解 . 清华大学出版社
7.3 MVC架构模式的认识
模型 -视图 -控制器( MVC )是 80 年代 Smalltalk-80 出现的一种软件设计模式,现在已经被
广泛的使用。
1、模型( Model)
模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑 .
2、视图( View )
视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。
3、控制器( controller)
控制器工作就是根据用户的输入,控制用户界面数据显示和更新 model 对象状态。
- / 27南昌大学软件学院 java web 大作业 实验报告
MVC 式的出现不仅实现了功能模块和显示模块的分离, 同时它还提高了应用系统的可维护性、可扩展性、可移植性和组件的可复用性早期的程序中, 如果不注意对数功能和显示的解耦合, 常常会导致程序的复杂及难以维护。很多 VB,Delphi 等 RAD 程序都有这种问题。甚至现在的 C#,Java 有时候也会出现把业务逻辑写在显示模块中的现象管 MVC 设计模式很早就提出, 但在 Web 项目的开发中引入 MVC 却是步履维艰。 主要原因:一是在早期的 Web 项目的开发中,程序语言和 HTML 的分离一直难以实现。 CGI 程序以字符串输出的形式动态地生成 HTML 内容。后来随着脚本语言的出现,前面的方式又被倒了过来,改成将脚本语言书写的程序嵌入在 HTML 内容中。这两种方式有一个相同的不足之处即它们总是无法将程序语言和 HTML 分离。二是脚本语言的功能相对较弱,缺乏支持 MVC 设计模式的一些必要的技术基础。 直到基于 J2EE 的 JSP Model 2 问世时才得以改观。 它用 JSP 技术实现视图的功能, 用 Servlet 技术实现控制器的功能, 用 JavaBean 技术实现模型的功能JSP Model 1 与 JSP Model 2SUN 在 JSP 出现早期制定了两种规范, 称为 Model1 和 Model2 。虽然 Model2 在一定程度上实现了 MVC ,但是它的应用用并不尽如人意JSP Model 1JSP Model 2
- / 27南昌大学软件学院 java web 大作业 实验报告
model2 容易使系统出现多个 Controller ,并且对页面导航的处理比较复杂有些人觉得 model2 仍不够好,于是 Craig R. McClanahan 2000 年 5 月 提交了一个WEB framework 给 Java Community. 这就是后来的 Struts.2001 年 7 月, Struts1.0 ,正式发布。该项目也成为了 Apache Jakarta 的子项目之一Struts 质上就是在 Model2 的基础上实现的一个 MVC 架构。它只有一个中心控制器, 他采用 XML 定制转向的 URL。采用 Action 来处理逻辑。
JSP详解(四大作用域和九大内置对象)
一、JSP
1、什么是JSP?
JSP(Java Server Pages):是以Java语言为基础的动态网页开发技术,
特点:
Servlet特点:在Java源码中嵌入html源码
JSP特点:在html源码中嵌入java代码
JSP就是Servlet
1、tomcat获得JSP文件后,先将JSP转成servlet,变成xxx.java(servlet源码),
D:\\java\\tomcat7.0\\apache-tomcat-7.0.53\\apache-tomcat-7.0.53\\work\\Catalina\\localhost\\test01\\org\\apache\\jsp
tomcat安装目录 引擎 主机 项目 固定包名 这个之下就是存放着jsp变成的servlet文件.java和编译文件.class
2、tomcat将java文件编译成class文件
3、tomcat运行class文件,并将结果输出到浏览器,
实例:
创建一个jsp。查看其转换后的servlet代码。
NewFile.jsp
复制代码
NewFile_jsp.java
复制代码
可以看到public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent
NewFile_jsp.java继承自HttpJspBase。来看看HttpJspBase的源码
HttpJspBase.java
复制代码
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage
看到了一个熟悉的类,HttpServlet,我们编写Servlet时就是继承自该类,这里也是继承HttpServlet,并且HttpJspBase的源码会发现,生命周期也是有init()方法,service()方法,destory()方法,相当于_jspService()方法就是servlet的service()方法的执行,所以说JSP也是一个servlet。
我们在JSP写的所有html代码,都会被转换为servlet中的out.write(html)代码来输出。看图
小总结:
对于jsp转换成的servlet源码,之后我们会在进行详细分析,现在只需要知道jsp中的内容在servlet中被转换成什么了,在哪里被转换了即可。其中_jspService()方法的详细内容下面会讲解
注意:jsp 生成java源码,默认第一次生成,之后直接执行,除非内容修改,具体点说,由于JSP只会在客户端第一次请求的时候被编译,因此第一次请求JSP时会感觉比较慢,而之后的请求因为不会编译JSP,所以速度就快多了,如果将Tomcat保存的JSP编译后的class文件删除,Tomcat也会重新编译JSP。在开发Web程序的时候经常需要修改JSP,Tomcat能够自动检测到JSP程序的改动,如果检测到JSP源代码发生了改动,Tomcat会在下次客户端请求JSP时重新编译JSP,而不需要重启Tomcat,这种自动检测功能默认是开启的,检测改动会消耗少量的时间,在部署web应用程序的时候可以在web.xml中将它关掉。这也就是为什么我们能够在jsp页面直接修改内容,而不用重新启动服务器的原因。
因为JSP就是servlet,那么生命周期也就是跟serlvet一样。
JSP和servlet有一点区别就在于:jsp是先部署后编译,而servlet是先编译后部署。
二、JSP语法
JSP模版数据:
就是JSP中的HTML代码,它的内容给是固定的,无论程序如何运行模版数据输出到客户端浏览器时都不会发生改变,当我们创建一个JSP时,模版就已经固定了。
元素:JSP中的java部分,包括脚本(JavaScript,或者java代码)以及JSP指令(Directive)与JSP标签(Tag)等,元素决定着程序的流程,元素是不会显示到浏览器的。这几个都会在接下来讲解到
JSP脚本:
1、使用<% 编写java代码 %>,中间java代码必须遵循Java语法,
为什么能够使用out输出?这里就涉及到了JSP的九大内置对象了,后面会讲解到,到时候回过头来在看看这里,就会知道为什么可以使用。
来看看,jsp变为servlet时的代码是如何编写的。
在JSP中JSP指令(后面会讲): <%@ page language=\”java\” contentType=\”text/html; charset=UTF-8\” pageEncoding=\”UTF-8\”%>
这句代码在servlet就变为了response.setContentType(\”text/html; charset=UTF-8\”);//这句代码的意思就是通知tomcat和浏览器都使用UTF-8码表,并且发送回浏览器的数据类型是text/html。这是有JSP指令中画红色部分代码转变的,而指令中的pageEncoding=\”UTF-8\”的意思是JSP转换为Servlet时采用UTF-8码表编码,因为可能JSP中包含中文。
对于JSP模版数据来说,就原封不动的使用out.write()来输出到浏览器
而对于JSP元素来说,就会变成普通的java代码,因为在servlet中,就可以直接编写java代码。
2、使用<%=xxx %>来输出结果
使用<%=result %>来输出结果,servlet中就会将其转换为out.print(result)进行输出。输出各种类型数据:int、double、boolean、String、Object等
3、JSP注释
<%– –%> :jsp注释,
// :java单行注释
/* */ :Java多行注释
<!– –> :这个注释,会发送到浏览器端的源码中显示
注释分别在servlet中如何显示的?
JSP注释不会在servlet文件中显示,而java注释则会,但其所有的注释到了浏览器端,都不会出现在源码中,只有<!– –>这个注释会到浏览器的网页源码中去
4、JSP中申明方法与属性(全局变量) 使用<%! 方法、属性%>
这个就不演示了,就是在JSP中编写方法或者属性时,使用<%! %>括起来。
5、在JSP中使用if语句,或者使用for循环,whilt循环等都可以实现,也就是编写脚本而已。
三、JSP指令
指令用来申明JSP页面的一些属性,比如编码方式,文档类型。我们在servlet中也会申明我们使用的编码方式和响应的文档类型的,而JSP就是用指令来申明。上面我们也说到了一条指令,也就是page指令,
JSP指令格式:<%@ directive {attribute=value}* %>
解释:directive:指令名称,例如page指令
attribute=value:紧跟指令名称后面的就是各种属性,以键值对的形式书写
*:代表后面能跟0个或多个属性。
例如: page指令:用来声明JSP页面的属性等。
<%@ page language=\”java\” contentType=\”text/html; charset=UTF-8\” pageEncoding=\”UTF-8\”%> page指令,后面跟着三个属性,分别是language、contentType、pageEncoding。这只是其中的几个属性,并没有写全,page指令允许的属性如下表所示
属性名称 取值范围 描述
language java 解释该JSP文件时采用的语言,一般为java语言,默认为java
extends 任何类的全名 编译该JSP文件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等方法
import 任何包名、类名 引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用uogelei,中间用英文逗号隔开,
如<%@ page import=\”java.util.List,java.util.ArrayList\”%>
session true、false 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true
autoFlush true,false 是否运行缓存,如果为true,则使用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存了或者程序执行完毕或者执行out.flush()操作时才到客户端,默认为true。
buffer none或者数字KB 指定缓存大小,当autoFlush设为true时有效,例如<%@ page buffer=10kb%>
isThreadSafe true,false 是否线程安全,如果为true,则运行多个线程同时运行该jsp程序,否则只运行一个线程,其余线程等待,默认为false
isErrorPage true,false 指定该页面是否为错误显示页面,如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有,默认为false
errorPage 某个JSP页面的相对路径 指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面,errorPage指定的页面通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常
contentType 有效的文档类型 客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、GIF图 像为image/gif、WORD文档为application/msword,该属性常跟着charset设置编码一起,作用是通知服务器和浏览器都使用同一 个码表
info 任意字符串 指明JSP的信息,该信息可以通过Servlet.getServletInfo()方法获取到
trimDirective Whitespaces true、false 是否去掉指令前后的空白字符,默认为false
pageEncoding UTF-8,ISO-8859-1等 指定一张码表来对该JSP页面进行编码,include指令
比较简单,只有一种形式 <%@ include file=\”relativeURL\”%> relativeURL:本应用程序内另一个JSP文件或者HTML文件的路径,例如,网址内所有页面均有一个统一风格的导航栏和页脚版权,那么就可以使用该指令将其包含进来,
特点:include指令会将包含页面的源代码添加到使用include指令的页面中来,然后编译成class文件,而等下会讲到的一个JSP行为,<jsp:include page=\”relativeURL\”>作用跟include指令一样,但是不同的是,include行为是运行时单独执行包含页面,然后把执行的结果包含到本页面来,属于先运行后包含。
taglib指令 JSP支持标签技术,后面会讲到标签的用法,jstl标签库的使用等,作用:用来指明JSP页面内使用的JSP标签库,taglib指令有两个属性,uri为类库的地址,prefix为标签的前缀<%@ taglib uri=\”http://java.sun.com/jsp/jstl/core\” prefix=\”c\”%>
四、JSP行为
前面讲了JSP语法,介绍了JSP页面中的内容有哪些,分别有什么作用,就两个东西,模块数据和元素。其中元素有包括脚本,指令,标签,脚本就是JSP中嵌入java代码,指令作用就是申明页面的属性,那标签是干嘛的,标签分为JSP自带内置的标签,和通过taglib指令来使用JSP标签库,或者自定义标签。现在我们先来讲一些JSP内置的标签。
JSP内置的标签就被称为JSP行为(JSP Actions)。只要书写很少的标记代码就能使用JSP提供的丰富功能,JSP行为其实是对常用的JSP功能的抽象与封装,可以取代jsp脚本,让JSP中就少一些嵌入java代码的地方。
格式:<jsp:elements {attribute=\”value\”}* />
jsp:标签的前缀,说明是jsp内置的标签,
elements:行为的名称,
attribute=value:使用键值对来编写属性
*:能指定0个或多个属性对
<jsp:include />行为
include行为用于运行时包含某个文件,如果被包含的文件为JSP程序,则先会执行JSP程序,然后在把执行的结果包含进来。 作用是跟include指令一样的,唯一的区别就在于,include指令是将被包含的文件的源码加入到了本JSP程序中,然后在进行编译,属于静态包含,而include行为只是将被包含的文件的运行结果包含进自己。属于动态包含
Java bean行为
是一组与Java Bean 相关的行为,包括useBean行为、setProperty行为、getProperty行为等
Java Bean就是普通的Java类,也被称为POJO,只有私有的属性与对应的getter方法和setter方法,注意其中当私有的属性为boolean类型时,习惯上一般把getter方法写成isXxx();而不是getXxx();
useBean行为
<jsp:useBean id=\”beanObject\” class=\”className\” scope=\”Value\”> 作用:在jsp中定义一个java bean对象,
id:指明Java Bean对象的名称,JSP中可以使用该名称引用该Java Bean对象,相当于给new出来的对象取一个变量名,
class:Java Bean类的全名
scope:该java bean对象的作用范围,可以写的就四个,也就是JSP的四大作用域,page、request、session、application
page:只能在当前JSP页面使用,如果不在JSP页面,那么就会失效
request:这个前面学过,A页面请求转发到B页面,那么使用的是同一个request,那么A,B页面都算是request的作用域,也就是通过请求转发的页面都是其作 用域
session:该作用域在一个web项目下任何位置应该读访问的到,只要cookie不关闭,并且cookie设置 的访问路径为\”/\”,
application:其实就是Servlet中的servletContext,服务器下的所有项目都能访问到。
setProperty行为
<jsp:setProperty name=\”beanName\” property=\”propertyName\” value=\”\”>
对Java Bean对象进行属性的设置
name:java bean对象的名称,也就是在useBean行为中的id
property:对象中的属性名,
value:要对其属性进行赋值的值
getProperty行为
<jsp:getProperty name=\”beanName\” property=\”propertyName\” />
获取JavaBean对象的某个属性值
name:java bean 对象的名称,也就是在useBean行为中的id
property:对象的属性名
例子: javabean:User.java NewFile.jsp
User.java
复制代码
NewFile.jsp
复制代码
可以查看NewFile.jsp变为servlet后的源代码,看看我们写的javabean行为会被转换为何种语句
这里出现了一个JSP九大内置对象中的一个,pageContext。现在简单提一句,pageContext就是JSP页面的管理者(上下文),其中的getAttribute(name,scope)方法是获取指定作用域中的数据的,如果getAttribute(name)方法的话,默认是对page作用域进行操作,findAttribute(name)依次从page、request、session、application获得内容。
在第一个红框中,就代表中我们的useBean行为,其中进行了一次判断,就是如果在page作用域中找不到user这个对象,那么就创建一个新的,否则就使用找到的这个user对象,
第二个红框中,代表着我们的setProperty行为,先找到user对象,然后在对其属性进行赋值
第三个红框中,代表着我们的getProperty行为,也是先找到user对象,然后在获取其属性的值。
注意:对于javabean行为来说,有一个特点的地方,就是当请求过来的参数对应javabean的属性时,可以为其一次性设置所有的值
<jsp:setProperty name=\”user\” property=\”*\” /> //设置user的所有属性,属性值从request中自动取得,*代表所有属性。
<jsp:forward />行为
实现请求转发功能,Servlet中通过request.getRequestDispatcher(\”someServlet\”).forward(request,response);而在JSP中也能够实现相同的功能,只不过用的是<jsp:forward />行为,实际上forward行为就是对其进行了封装。
格式:
<jsp:forward page=\”someServlet\”>
<jsp:param name=\”param1\” value=\”value1\”/>
<jsp:param name=\”param2\” value=\”value2\”/>
</jsp:forward>
page:需要跳转到的页面或者servlet、 <jsp:param/>参数行为,带一些参数过去,name、value是以键值对的形式带过去的
例如:
NewFile.jsp
MyServlet.java
访问:http://localhost:8080/test01/NewFile.jsp
浏览器地址栏没有改变,说明是请求转发
NewFile_jsp.java
使用return的好处是执行完上面的转发,就直接return,没有必要在执行下面的代码了,对参数使用了URLEncode进行编码,说明该<jsp:param/>可以直接传递中文,但是前提是要设置request.setCharacterEncoding(\”UTF-8\”);为什么这样做,看上面框起来中的代码。
<jsp:directive/>行为
directive行为,就相当于JSP指令,比如<jsp:directive.page/>相当于<%@ page %>指令,等等其它指令是一样的书写格式。
五、JSP隐藏的九大内置对象和四大作用域
之前那么一大段内容,就是为了讲解什么是JSP,JSP中的内容是怎么样的,到这里应该知道的差不多了, 但我们还要深入了解一些东西,我们知道JSP中的内容就只有两种,模版数据,和元素,元素就包括了指令呀,脚本呀,标签(行为)呀,脚本会慢慢被标签全部代替,也就是说JSP中基本上不会嵌入Java代码,但是我们也知道JSP会转换为servlet,在Servlet中,输出数据时,都需要通过response.getWrite();但是在JSP中,直接使用out对象进行输出,为什么呢?这就是因为out为JSP的一个隐藏对象,JSP中内置了9个隐藏对象,使得JSP比Servlet使用起来更简单,更方便,
page、config、application、request、response、session、out、exception、pageContext
page:page对象代表当前JSP页面,是当前JSP编译后的Servlet类的对象。相当于this。
config:标识Servlet配置,类型:ServletConfig,api跟Servlet中的ServletConfig对象是一样的,能获取该servlet的一些配置信息,能够获取ServletContext
application:标识web应用上下文,类型:ServletContext,详情就看Servlet中的ServletContext的使用
request:请求对象, 类型:httpServletRequest
response:响应对象 类型:httpServletResponse
session:表示一次会话,在服务器端记录用户状信息的技术
out:输出响应体 类型:JspWriter
exception 表示发生异常对象,类型 Throwable,在上面我们介绍page指令中的一个errorPage属性时就有说到他
pageContext:表示 jsp页面上下文(jsp管理者) 类型:PageContext
标记了红色的对象就是JSP独有的,其他的都是Servlet中的老东西。
在这个由jsp转换为servlet的文件中,只能看到8个内置对象,少了exception对象,因为我们在将page指令时,说过一个isErrorPage属性,默认是false,被关闭了,所以其中并没有exception对象。
JSP的四大作用域:page、request、session、application
这四大作用域,其实就是其九大内置对象中的四个,为什么说他们也是JSP的四大作用域呢?因为这四个对象都能存储数据,比如request.setAttribute()注意和request.setParameter()区分开来,一个是存储在域中的、一个是请求参数,session.setAttribute()、application其实就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext对象来进行了。在上面我们也有提到JSP的四大作用域,
page作用域:代表变量只能在当前页面上生效
request:代表变量能在一次请求中生效,一次请求可能包含一个页面,也可能包含多个页面,比如页面A请求转发到页面B
session:代表变量能在一次会话中生效,基本上就是能在web项目下都有效,session的使用也跟cookie有很大的关系。一般来说,只要浏览器不关闭,cookie就会一直生效,cookie生效,session的使用就不会受到影响。
application:代表变量能一个应用下(多个会话),在服务器下的多个项目之间都能够使用。比如baidu、wenku等共享帐号。
out对象:
类型:JspWriter
jsp 输出底层使用 response.getWriter();什么意思呢?这里就要讲解一下JSP缓存和Servlet缓存了,输出的过程是这样的
JSP页面转换为Servlet后,使用的out对象是JspWriter类型的,所以是会先将要发送的数据存入JSP输出缓存中,然后,等JSP输出缓存满了在自动刷新到servlet输出缓存,等serlvet输出缓存满了,或者程序结束了,就会将其输出到浏览器上。除非手动out.flush()。
验证servlet输出缓存和JSP输出缓存和我们上面所说的是正确的。
4、提供作用域常量
pageContext对象:重点
这个功能就比较强大了,比较牛逼,基本上什么他都有,因为是它是JSP页面的管理者(上下文),所以JSP中的内置对象呀,它统统能够获得,下面介绍它的api。
1、获得其它八大内置对象 getXxx()
pageContext.getOut(); //获得out对象
pageContext.getApplication(); //获得application对象
等等….
2、对作用域的属性进行操作(四大作用域)
对默认作用域的属性进行操作。page
pageContext.getAttribute(name); //获得page作用域数据
pageContext.setAttribute(name,value); //给page作用域设置内容
pageContext.removeAttribute(name); //给page作用域移除内容
3、对指定作用域的属性进行操作
getAttribute(name,scope); //获得 指定作用域中的数据
setAttribute(name,value); //给指定作用域设置内容
removeAttribute(name ,scope) 移除指定作用域的内容(page/request/session/application)
4、提供作用域常量
PageContext.PAGE_SCOPE page
PageContext.REQUEST_SCOPE request
PageContext.SESSION_SCOPE response
PageContext.APPLICATION_SCOPE application
5、一次获得指定名称内容
findAttribute(name); //依次从page、request、session、application 获得内容
response对象:
就是响应对象,、如果不了解就看看讲解request和response的这一章节的内容
config对象:
类型:ServletConfig
能够获取servlet的初始化参数,获取servletContext对象,获取servletName
api详情请看讲解servlet这一章节
exception异常对象:
包含了异常的信息
使用它,必须结合page指令中的isErrorPage属性和errorPage属性。
exception.jsp 抛异常的一个NullPointException,并且跳转到error.jsp错误显示页面 errorPage属性的意思是如果发生未捕捉到的异常,将会跳转到error.jsp页面
error.jsp isErrorPage属性说明该页面是一个错误显示页面,则可以使用exception对象
访问http://localhost:8080/test01/exception.jsp
六、总结
通过上面一大堆一大堆的学习,我们应该知道这些东西
1、什么是JSP?
JSP本质上就是一个servlet,因为servlet输出html太麻烦了,所以就有了JSP,JSP就是专门用来书写html的,当然其中也能写java代码。
2、JSP的内容包括什么?
模版数据和元素。其中元素有包括脚本(java代码)、指令(页面属性)、和行为(标签,为了JSP中不嵌入那么多java代码衍生的)
3、JSP中九大内置对象是哪九个?
九大内置对象,page、config、appliction、request、response、session、out、exception、pageContext
4、九大内置对象和servlet中对象的关系
page就是jsp转换为servletservlet对象本身,也就是this
config — Servlet中的servletConfig
application — Servlet中的ServletContext
request – Servlet中的request
response – Servlet中的response
session – Servlet中的session
out – JspWriter
exception – 异常对象
pageContext – 表示 jsp页面上下文(jsp管理者) 类型:PageContext,
其中pageContext对象最牛逼,有了他就拥有了天下,哈哈~
5、JSP中的四大作用域。
page、request、session、application
其中操作page域中属性需要借助pageContext对象。
6、JSP中还有其他两大块内容
一个是EL表达式,很重要,
另一个是jstl标签库的使用,也很重要
rvlet中的session
out – JspWriter
exception – 异常对象
pageContext – 表示 jsp页面上下文(jsp管理者) 类型:PageContext,
其中pageContext对象最牛逼,有了他就拥有了天下,哈哈~
5、JSP中的四大作用域。
page、request、session、application
其中操作page域中属性需要借助pageContext对象。
6、JSP中还有其他两大块内容
一个是EL表达式,很重要,
另一个是jstl标签库的使用,也很重要
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。