第六讲(参考《Java
Web程序设计基础教程》第6、9章)
1、分析登录功能
界面:登录界面index1.jsp;登录成功的界面login_success.jsp。
功能:UserBean的login方法完成登录的判断。
Servlet:LoginServlet.java
(1)接收用户输入的用户名和口令(2)调用UserBean的login方法进行判断(3)根据方法的返回值选择界面响应。
2、MVC模式
M表示模型,主要表示系统中的功能处理部分。例如,上面的UserBean就是一个模型,描述用户信息以及相关功能。
V表示视图,表示系统中与人进行交互的部分。例如,上面的index1.jsp和login_success.jsp。
C表示控制器,建立模型与视图之间的关联关系。例如,上面的LoginServlet.java。
输入界面直接调用控制器,控制器接收用户在输入界面上输入的信息,控制器把信息传递给模型,调用模型的方法,方法会给控制器返回一个值,控制器根据这个值选择输出界面对用户响应。
MVC模式把系统的每一个功能都分解成这个3个部分。然后分别实现。
3、采用MVC模式实现注册功能
一般先考虑V,包括输入界面和输出界面,对于注册功能来说,输入是注册界面,输出是注册成功或者失败的界面,通常使用JSP文件。
接下来考虑M,功能如何实现,对于注册功能来说,需要把用户提交的信息写到数据库中。需要在UserBean中编写添加用户的方法。
考虑C,如何协调M和V。需要编写Servlet,在doGet或者doPost方法中主要完成:接收输入;调用UserBean的方法;选择界面响应。
4、创建注册用的表
create table
usertable2
(
username varchar(10) primary
key,
userpass varchar(10),
sex char(2),
fav varchar(20),
degree varchar(8),
comment varchar(100),
email varchar(30)
)
5、V部分
采用原来的register.jsp和success.jsp。
6、M部分
在UserBean中添加方法,add方法。方法代码如下:
public boolean add(){
// 定义变量
Connection con = null;
PreparedStatement stmt = null;
String driverClass = "sun.jdbc.odbc.JdbcOdbcDriver";
String url = "jdbc:odbc:bookstore";
String sql = "insert into usertable2 values(?,?,?,?,?,?,?)";
boolean success = true;
try{
// 第一步:加载驱动
Class.forName(driverClass);
// 第二步:建立连接
con = DriverManager.getConnection(url,"","");
// 第三步:创建语句对象
stmt = con.prepareStatement(sql);
// 第四步:对SQL语句中参数赋值
stmt.setString(1,username);
stmt.setString(2,userpass);
stmt.setString(3,sex);
stmt.setString(4,fav);
stmt.setString(5,degree);
stmt.setString(6,comment);
stmt.setString(7,email);
// 第五步:执行SQL语句
int n = stmt.executeUpdate();
// 执行没有结果集返回的SQL语句使用executeUpdate方法,方法的返回值是整数,表示操作成功的记录数
if(n==0)
success = false;
}catch(Exception e){
success = false;
System.out.println(e.getMessage());
}finally{
try{ stmt.close(); }catch(Exception ee){}
try{ con.close(); }catch(Exception ee){}
}
return success;
}
7、C部分
编写Servlet,完成添加的控制。控制器的代码如下:
package servlet;
import
java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import
bean.*;
public class
AddUserServlet extends HttpServlet
{
public void doGet(HttpServletRequest
request,HttpServletResponse response) throws
IOException,ServletException
{
// 请求中采用的编码方式是8859_1,当前的编码是gb2312,需要转换
request.setCharacterEncoding("gb2312");
// 第一句话:获取用户输入的信息
String username = request.getParameter("username");
String userpass1 = request.getParameter("userpass1");
String sex = request.getParameter("sex");
// 因为允许多选,所以结果有可能是多个,应该使用数组接收。
String fav[] = request.getParameterValues("fav");
String favStr = "";
for(int i=0;i<fav.length;i++)
{
favStr += fav[i]+";";
}
String degree = request.getParameter("degree");
String comment = request.getParameter("content");
String email = request.getParameter("email");
// 第二句话:调用JavaBean,创建对象、初始化、然后调用方法
UserBean user = new UserBean();
user.setUsername(username);
user.setUserpass(userpass1);
user.setSex(sex);
user.setFav(favStr);
user.setDegree(degree);
user.setEmail(email);
user.setComment(comment);
boolean b = user.add();
// 第三句话:向页面传递信息
if(b)
request.setAttribute("info","注册成功!");
else
request.setAttribute("info","注册失败!");
// 第四句话:转向响应界面
RequestDispatcher rd =
request.getRequestDispatcher("success.jsp");
rd.forward(request,response); // 完成跳转
}
public void doPost(HttpServletRequest request,HttpServletResponse
response) throws IOException,ServletException
{
doGet(request,response);
}
}
之后对Servlet进行配置,在web.xml中添加如下代码:
<servlet>
<servlet-name>addUser</servlet-name>
<servlet-class>servlet.AddUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addUser</servlet-name>
<url-pattern>/addUser</url-pattern>
</servlet-mapping>
需要修改register.jsp中的form的属性action:
<form action="addUser" method="post"
name="form1">
8、测试
编译、启动服务器,然后运行。
第七讲(参考《Java
Web程序设计基础教程》第7章)
1、共享连接数据库的代码
连接数据库的基本过程:
1)加载驱动程序;
2)创建连接;
3)编写SQL语句;
4)创建语句对象;
5)对参数赋值;
6)执行SQL
语句;
7)对结果进行处理;
8)关闭对象。
对于不同的SQL的执行,不同的地方:
SQL语句;
参数;
结果的处理方式;
提取相同部分分别编写成方法:
Connection con =
null;
PreparedStatement stmt =
null;
ResultSet rs = null;
String driverClass =
"sun.jdbc.odbc.JdbcOdbcDriver";
String url =
"jdbc:odbc:bookstore";
//
完成连接的创建,相当于第1.2步
public Connection
getConnection() throws Exception{
Class.forName(driverClass); // 加载驱动程序
if(con == null)
con = DriverManager.getConnection(url,"","");
return con;
}
// 创建语句对象
public PreparedStatement
createStatement(String sql) throws Exception{
stmt = getConnection().prepareStatement(sql);
return stmt;
}
// 执行有结果集返回的方法
public ResultSet
executeQuery() throws Exception{
rs = stmt.executeQuery();
return rs;
}
//
执行没有结果集返回的方法
public int executeUpdate()
throws Exception{
return stmt.executeUpdate();
}
// 关闭对象
public void close(){
if(rs != null)
try{ rs.close(); }catch(Exception e){}
if(stmt != null)
try{ stmt.close(); }catch(Exception e){}
if(con != null)
try{ con.close(); }catch(Exception e){}
}
2、修改上一次课的添加功能,使用这些共享方法
String sql = "insert into usertable2 values(?,?,?,?,?,?,?)";
boolean success =
true;
try{
// 创建语句对象
createStatement(sql);
// 对SQL语句中参数赋值
stmt.setString(1,username);
stmt.setString(2,userpass);
stmt.setString(3,sex);
stmt.setString(4,fav);
stmt.setString(5,degree);
stmt.setString(6,comment);
stmt.setString(7,email);
// 执行SQL语句
int n = executeUpdate();
// 执行没有结果集返回的SQL语句使用executeUpdate方法,方法的返回值是整数,表示操作成功的记录数
if(n==0)
success = false;
}catch(Exception e){
success = false;
System.out.println(e.getMessage());
}finally{
close();
}
return success;
3、查询所有图书
1)创建图书表
create table books(
bookid varchar(10) primary key,
bookname varchar(30),
author varchar(20),
price float,
publisher varchar(20)
)
插入一些模拟数据
insert into books
values('00001','Java','zhangsan',20,'电子工业')
insert into books values('00002','JSP','lisi',22,'人民邮电')
insert into books values('00003','Java
EE','wang',30,'人民邮电')
2)V部分
V主要与人进行交互,要考虑输入和输出
输入:在导航条中添加“查看所有图书”的超链。
<a
href="findAllBooks">显示所有图书</a>
输出:显示所有图书信息的JSP文件。
文件名:books.jsp
文件内容:
<%@ page
contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@
include file="header.jsp"%>
<tr>
<td>
<table align="center"
border="1">
<tr>
<td>图书编号</td><td>图书名称</td><td>作者</td><td>价格</td><td>出版社</td>
</tr>
<!--
c:forEach用于循环控制,items属性指出要循环遍历的集合,var定义一个循环变量,表示集合中的一个元素
-->
<c:forEach var="book"
items="${books}">
<tr>
<td>${book.bookid}</td>
<td>${book.bookname}</td>
<td>${book.author}</td>
<td>${book.price}</td>
<td>${book.publisher}</td>
</tr>
</c:forEach>
</table>
</td>
</tr>
</table>
3)M部分
完成功能:从数据库中查询所有的图书。
文件名:BookBean.java
文件内容:
package bean;
import
java.sql.*;
import java.util.ArrayList;
public class
BookBean extends Base{
// 描述图书的属性
private String bookid;
private String bookname;
private String author;
private float price;
private String
publisher;
//
编写对乘员进行操作的方法
public void setBookid(String
bookid){
this.bookid = bookid;
}
public String
getBookid(){
return bookid;
}
public void
setBookname(String bookname){
this.bookname = bookname;
}
public String
getBookname(){
return bookname;
}
public void
setAuthor(String author){
this.author = author;
}
public String
getAuthor(){
return author;
}
public void
setPrice(float price){
this.price = price;
}
public float getPrice(){
return price;
}
public void
setPublisher(String publisher){
this.publisher = publisher;
}
public String
getPublisher(){
return publisher;
}
public ArrayList
findAllBooks(){
ArrayList books = new ArrayList();
String sql = "select * from books";
try{
createStatement(sql);
rs = executeQuery();
// 使用while循环遍历结果集
while(rs.next())
{
// 使用rs的getString方法,以字符串的形式获取第一列,参数也可以是列的名字
// 可以得到当前记录的每一列
String tempBookid = rs.getString(1);
String tempBookname = rs.getString(2);
String tempAuthor = rs.getString(3);
float tempPrice = rs.getFloat(4);
String tempPublisher = rs.getString(5);
// 创建图书对象
BookBean book = new BookBean();
book.setBookid(tempBookid);
book.setBookname(tempBookname);
book.setAuthor(tempAuthor);
book.setPrice(tempPrice);
book.setPublisher(tempPublisher);
// 把书添加到链表中
books.add(book);
}
}catch(Exception e){
System.out.println(e.toString());
}finally{
close();
}
return books;
}
}
4)C部分
控制器:4句话。本功能只用到3句。
文件名:FindAllBooks。
文件内容:
package servlet;
import
java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import
bean.*;
import java.util.ArrayList;
public class
FindAllBooks extends HttpServlet
{
public void doGet(HttpServletRequest
request,HttpServletResponse response) throws
IOException,ServletException
{
// 第二句话:调用JavaBean,创建对象、初始化、然后调用方法
BookBean book = new BookBean();
ArrayList books = book.findAllBooks();
// 第三句话:向页面传递信息,第一个参数是使用的名字,应该和显示时候使用的名字一致,第二个参数传递的值本身
request.setAttribute("books",books);
// 第四句话:转向响应界面
RequestDispatcher rd =
request.getRequestDispatcher("books.jsp");
rd.forward(request,response); // 完成跳转
}
public void doPost(HttpServletRequest request,HttpServletResponse
response) throws IOException,ServletException
{
doGet(request,response);
}
}
在web.xml中进行配置
<servlet>
<servlet-name>findAllBooks</servlet-name>
<servlet-class>servlet.FindAllBooks</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findAllBooks</servlet-name>
<url-pattern>/findAllBooks</url-pattern>
</servlet-mapping>