模式二:JSP+Servlet+JavaBean

链接地址:http://wxmimperio.coding.io/?p=189

JSP中两种模式的总结

链接地址:http://wxmimperio.coding.io/?p=207


用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变——摘自百度百科

(其实可以将javabean理解为一个类,我们用的时候调用各种里面的方法、读写属性和发送接收事件封装数据和操作从而使html的前台与jsp的后台实现部分分离,模块化强便于维护)

JSP网站开发技术标准给出了两种使用JSP的方式,这些方式都可以归结为

模式一:JSP+JavaBean

模式二:JSP+Servlet+JavaBean


已经用模式一做了两个toy program,所以做一下总结。

在JSP+JavaBean中,JSP页面独自相应请求并经处理返回,所有的数据通过Bean处理,JSP实现页面的表现,实现了表现和业务逻辑相分离,MVC设计模式(Model View Controller)。

但是大量使用使用这个模式时会带来一个副作用,会导致页面里嵌入了大量的java控制代码,当要处理的业务逻辑复杂时会让页面设计变得十分困难,所以这种模式适合小型项目而不适合大型的项目。


JSP访问JavaBean的方法:

1.导入JavaBean类

  通过<%@ page import>指令导入JavaBean类,

  例如:

  1. <%@ page import="rsystem.DB" %>

其中rsystem是一个包,DB是一个JavaBean类

2.声明JavaBean对象。

  <jsp:useBean>标签用来声明JavaBean对象,

  例如:

  1. <jsp:useBean id="myBean" class="rsystem.DB" scope="session"/>

其中id是名称,scope属性决定了JavaBean存在的范围,通常有page(默认)、requset、session、application

3.访问JavaBean属性。

  JSP提供了访问JavaBean属性的标签,如果要将JavaBean的某个属性输出到网页上,可以用<jsp:getProperty>标签。

  例如:

  1. <jsp:getProperty name="myBean" property="count"/>

  如果要给JavaBean的某个属性赋值,可以用<jsp:setProperty>标签,

  例如:

  1. <jsp:setProperty name="myBean" property="count" value="0"/>

实例说明:

这里写一个用户注册的小例子帮助理解这种模式,会用到JDBC编程和SQL的相关知识,这里不做相关介绍。

(我的开发环境是Idea+Tomcat+Mysql,提前做好相应jar包的引入)

数据库脚本:

  1. create database register;
  2. use register;
  3. #会员注册信息
  4. create table user_info(
  5. userName varchar(20) not null,                          #用户名
  6. passWord varchar(20) not null,                          #用户密码
  7. email varchar(20)                                               #email地址
  8. );

1.表示注册信息的JavaBean(registerInfo.java)

  • package rsystem;
  • /**
  • * 此JavaBean,表示了注册信息的数据
  • */
  • public class registerInfo {
  • private String username,password,email;
  • //set和get方法
  • public void setUsername(String username) {
  • this.username = username;
  • }
  • public String getUsername() {
  • return username;
  • }
  • public void setPassword(String password) {
  • this.password = password;
  • }
  • public String getPassword() {
  • return password;
  • }
  • public void setEmail(String email) {
  • this.email = email;
  • }
  • public String getEmail() {
  • return email;
  • }
  • }

2.表示执行数据库操作的JavaBean(registerBD.java)

  • package rsystem;
  • import java.sql.*;
  • import java.util.*;
  • /**
  • * 此JavaBean,表示了对数据库的操作
  • */
  • public class registerBD {
  • private Connection con;
  • registerInfo rinfo;
  • //获取数据库连接
  • public registerBD() {
  • try {
  • Class.forName("com.mysql.jdbc.Driver");
  • String url = "jdbc:mysql://localhost:3306/register?user=root&password=root";
  • con = DriverManager.getConnection(url);
  • } catch (ClassNotFoundException e) {
  • e.printStackTrace();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • }
  • //设置属性
  • public void setRegisterInfo(registerInfo rinfo) {
  • this.rinfo = rinfo;
  • }
  • public void addRegisterInfo()throws Exception {
  • //信息插入数据库,JDBC相关操作
  • try {
  • String sql = "insert into user_info(userName,passWord,email) values(?,?,?)";
  • PreparedStatement stm = con.prepareStatement(sql);
  • stm.setString(1,rinfo.getUsername());
  • stm.setString(2,rinfo.getPassword());
  • stm.setString(3,rinfo.getEmail());
  • stm.executeUpdate();
  • con.close();//关闭数据库连接
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • }
  • //获取用户信息,返回结果到JSP页面
  • public Collection getRegisterInfo()throws Exception {
  • //信息从数据库查询,JDBC相关操作
  • Collection ret = new ArrayList();
  • try {
  • Statement stm = con.createStatement();
  • ResultSet result = stm.executeQuery("select count(*) from user_info");
  • int register_count = 0;
  • if(result.next()) {
  • register_count = result.getInt(1);
  • result.close();
  • }
  • if(register_count > 0) {
  • result = stm.executeQuery("select * from user_info");
  • while (result.next()) {
  • String username = result.getString("username");
  • String password = result.getString("password");
  • String email = result.getString("email");
  • registerInfo rinfo = new registerInfo();
  • rinfo.setUsername(username);
  • rinfo.setPassword(password);
  • rinfo.setEmail(email);
  • ret.add(rinfo);
  • }
  • result.close();
  • stm.close();
  • }
  • con.close();
  • } catch (Exception e) {
  • e.printStackTrace();
  • throw e;
  • }
  • return ret;
  • }
  • }

3.填写用户信息的html(registerPage.html)

  • <!DOCTYPE html>
  • <html>
  • <head lang="en">
  • <meta charset="gbk">
  • <title></title>
  • </head>
  • <body>
  • <td><table align="center" border="1" cellpadding="0" cellspacing="0">
  • <form action="registerOk.jsp">
  • <tr>
  • <td>用户名:</td>
  • <td><input type="text" name="username" size="25"></td>
  • </tr>
  • <tr>
  • <td>密码:</td>
  • <td><input type="password" name="password" size="25"></td>
  • </tr>
  • <tr>
  • <td>邮箱:</td>
  • <td><input type="text" name="email" size="25"></td>
  • </tr>
  • <tr>
  • <td><input type="submit" value="提交注册"></td>
  • </tr>
  • </form>
  • </td></table>
  • </body>
  • </html>

4.调用JavaBean添加注册信息到数据库的JSP(registerOk.jsp)

  • <%@ page contentType="text/html;charset=gbk" language="java" %>
  • <%@ page import="java.sql.*,rsystem.*, java.util.*" %>
  • <%--JSP访问JavaBean--%>
  • <jsp:useBean id="registerInfo" class="rsystem.registerInfo" scope="page">
  • <jsp:setProperty name="registerInfo" property="*"></jsp:setProperty>
  • </jsp:useBean>
  • <jsp:useBean id="registerBD" class="rsystem.registerBD" scope="page"></jsp:useBean>
  • <html>
  • <head>
  • <title></title>
  • </head>
  • <body>
  • <%
  • //调用JavaBean中的方法
  • try {
  • registerBD.setRegisterInfo(registerInfo);
  • registerBD.addRegisterInfo();
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • %>
  • <%--页面跳转--%>
  • <jsp:forward page="registerView.jsp"></jsp:forward>
  • </body>
  • </html>

5.显示添加信息的JSP页面,即从数据库读取显示(registerView.jsp)

  • <%@ page contentType="text/html;charset=gbk" language="java" %>
  • <%@ page import="java.sql.*,rsystem.*, java.util.*" %>
  • <jsp:useBean id="registerBD" class="rsystem.registerBD" scope="page"></jsp:useBean>
  • <html>
  • <head>
  • <title></title>
  • </head>
  • <body>
  • <%
  • Collection registers = registerBD.getRegisterInfo();
  • Iterator it = registers.iterator();
  • while (it.hasNext()) {
  • registerInfo register = (registerInfo)it.next();
  • %>
  • <table align="center" border="1" cellpadding="0" cellspacing="0">
  • <tr>
  • <td>用户名:<%=register.getUsername()%></td>
  • </tr>
  • <tr>
  • <td>密码:<%=register.getPassword()%></td>
  • </tr>
  • <tr>
  • <td>邮箱:<%=register.getEmail()%></td>
  • </tr>
  • </table>
  • <%
  • }
  • %>
  • </body>
  • </html>

运行:

在浏览器里输入registerPage.html的地址,填入用户信息进行注册,会自动跳转到registerView.jsp页面显示信息。

registerPage.html注册页面:

registerView.jsp显示页面:

参考:圣骑士Wind的博客、JSP应用开发详解(第三版)

JSP中使用的模式——JSP+JavaBean的更多相关文章

  1. JSP中使用的模式——JSP+Servlet+JavaBean

    上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...

  2. jsp中的@include与jsp:include区别详解

    1 前言 搞java开发的人也许都知道在jsp中引入项目中其他文件有如下两种方式 <%@include file="xxx.jsp"%> <jsp:include ...

  3. 【JSP中引入文件】JSP中获取根路径+引用js文件

    在jsp界面中经常需要引入js.css等文件,通常都需要先获取项目根路径,然后再引入文件. 例如: 项目路径如下,需要在index.jsp中引入FusionCharts相关的js.css等: inde ...

  4. jsp中java代码、jsp代码、js代码执行的顺序

    原理: jsp中的Java代码 -- 服务器端代码 js代码 -- 客户端代码 java是在服务器端运行的代码,jsp在服务器的servlet里运行,而JavaScript和html都是在浏览器端运行 ...

  5. JSP中两种模式的总结

    运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...

  6. Javabean及其在jsp中的应用

    Javabean及其在jsp中的应用 一.Javabean简介 用作JavaBean的类必须具有一个公共的.无参数的构造方法. JavaBean的属性与普通Java类的属性的概念不一样,JavaBea ...

  7. 在JSP页面中调用另一个JSP页面中的变量

    在jsp学习中,经常需要在一个jsp页面中调用另一个jsp页面中的变量,下面就这几天的学习,总结一下. jsp页面之间的变量调用有多种方法: 1.通过jsp的内置对象—request对象获取参数: ( ...

  8. jsp2.0+中的标签文件,JSP Fragment技术

    刚进新公司不久,今天在看到项目中用到了.tag文件.刚开始我还以为这个是第三方类似freemarker的模板技术.问了下项目组的其他人员,原来这是jsp2.0以来就有的JSP Fragment技术.以 ...

  9. jsp中导入导出excel,ssh框架

    导入Excel:jsp中 <form action="user_importTradingMoney" enctype="multipart/form-data&q ...

随机推荐

  1. gwt中java与js的相互调用

    1. java通过jsni调用内部js Button button = new Button("java调用内部jsni的js方法"); button.addClickHandle ...

  2. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...

  3. [D3] 13. Cleaner D3 code with selection.call()

    selection.call() method in D3 can aid in code organization and flexibility by eliminating the need t ...

  4. Java中NaN和-0.0f的比较问题

    简单的说,比较两个int型或long型的数据没有什么问题,可以用==来判断,但对浮点数(float与double)来说,需要对Float.NaN和0.0这个两个特殊数字作额外的处理.Float.NaN ...

  5. Java的JDBC事务详解(转)

    事务的特性: 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行. 2) 一致性(consistency):事务在完 ...

  6. MVVM架构的一次实践,重写iOS头条客户端

    前言: 一个iOS头条APP,使用MVVM架构实现,代码中有注释,封装了AFN网络请求,解媾代码,使用起来非常方便.用最经典的TableView展示,后续不断更新,喜欢就star或fork一下,有问题 ...

  7. 【原】个人对win7开机黑屏只有鼠标排障总结

    个人对win7开机黑屏只有鼠标排障总结 文:铁乐猫 第一种情况是explorer.exe进程丢失或损坏有关: 判断方法是按Ctrl+Alt+Del键能呼出任务管理器,结束explorer.exe进程, ...

  8. Android 指定日期时间执行任务的Timer

    放上一个指定详细日期及时间的timer public class MainActivity extends Activity { private Handler handler = new Handl ...

  9. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  10. o] TortoiseGit错误 - Could not get all refs. libgit2 returned: corrupted loose reference file

    因无法追溯的同步操作错误或工程文件错误,造成Git 同步时报错: Could not get all refs. libgit2 returned: corrupted loose reference ...