----知道自己错在哪的猿是幸福的。
基本功:
要求会用自己的话讲解、MVC设计模式特点、画出MVC处理流程图:程序编写要靠思想!!!
登录程序流程图:
程序清单及作用:整体编程思想!!!
-- 使用 zz 数据库
use zz;
-- 删除 user 表
drop table user if exists user;
-- 创建 user 表
create table user(
userid varchar(30) primary key,
name varchar(30) not null,
password varchar(30) not null
);
insert into user
(userid, name , password) values
('admin', 'administrator', 'admin');
D:\ProgramFiles\webdemo\WEB-INF\classes\User.java
package zz.vo;
public class User{
private String userid;
private String name;
private String password;
public void setUserid(String userid){ // 用户ID
this.userid = userid;
}
public String getUserid(){
return this.userid;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setPassword(String password){
this.password = password;
}
public String getPassword(){
return this.password;
}
}
D:\ProgramFiles\webdemo\WEB-INF\classes\DatabaseConnection.java
package zz.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
public class DatabaseConnection{
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
public static final String DBURL = "jdbc:mysql://localhost:3306/zz";
public static final String DBUSER = "root";
public static final String DBPASSWORD = "mysql";
public Connection conn = null;
public DatabaseConnection()throws Exception{ //在构造方法中进行数据库连接
try{
Class.forName("DBDRIVER"); // 加载驱动
this.conn = DriverManager.
getConnection(DBURL, DBUSER, DBPASSWORD); // 连接数据库
}catch (Exception e){
throw e;
}
}
public Connection getConnection(){ // 取得数据库连接
return this.conn;
}
public void close()throws Exception{
if (this.conn != null){
try{
this.conn.close();
}catch (Exception e){
throw e;
}
}
}
}
D:\ProgramFiles\webdemo\WEB-INF\classes\IUserDAO.java
package zz.dao;
import zz.vo.User;
public interface IUserDAO{
/****************执行查询操作************
*用户登录验证
*@param user 传入VO对象
*@return 验证的操作结果
*@throws Exception
*/
public boolean findLogin(User user) throws Exception;
}
D:\ProgramFiles\webdemo\WEB-INF\classes\UserDAOImpl.java
package zz.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import zz.dao.IUserDAO;
import zz.vo.User;
// 实现类
public class UserDAOImpl implements IUserDAO{
private PreparedStatement pstmt = null;
private Connection conn = null;
public UserDAOImpl(Connection conn){ // 构造方法中设置数据库连接对象!
this.conn = conn;
}
public boolean findLogin(User user)throws Exception{
boolean flag = false;
try{
String sql = "SELECT name From user WHERE userid=? AND password=? ";
this.pstmt = this.conn.prepareStatement(sql); //实例化
this.pstmt.setString(1, user.getUserid()); // 设置userid
this.pstmt.setString(2, user.getPassword()); // 设置password
ResultSet rs = this.pstmt.executeQuery(); // 取得查询结果
if (rs.next()){
user.setName(rs.getString(1)); // 取得姓名
flag = true;
}
}catch (Exception e){
throw e;
}finally{
if (this.pstmt != null){
try{
this.pstmt.close();
}catch (Exception e){
throw e;
}
}
}
return flag;
}
}
D:\ProgramFiles\webdemo\WEB-INF\classes\UserDAOProxy.java
package zz.dao.proxy;
import zz.dao.IUserDAO;
import zz.dao.impl.UserDAOImpl;
import zz.dbc.DatabaseConnection;
import zz.vo.User;
public class UserDAOProxy implements IUserDAO{
private DatabaseConnection dbc = null; // 定义数据库连接
private IUserDAO dao = null; // 定义实现类DAO接口
public UserDAOProxy(){
try{
this.dbc = new DatabaseConnection(); // 实例化数据库连接
}catch (Exception e){
e.printStackTrace();
}
this.dao = new UserDAOImpl(this.dbc.getConnection());
}
public boolean findLogin(User user)throws Exception{
boolean flag = false;
try{
flag = this.dao.findLogin(user); // 调用真实主题
}catch (Exception e){
e.printStackTrace();
}finally{
this.dbc.close();
}
return flag;
}
}
工厂类:
package zz.factory;
import zz.dao.IUserDAO;
import zz.dao.proxy.UserDAOProxy;
public class UserFactory{
public static IUserDAO getIUserDAOInstance()throws Exception{ // 取得DAO实例
return new UserDAOProxy(); // 返回代理类实例
}
}
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head><title>用户登录程序</title></head>
<script language="JavaScript">
function validate(f){
if (!(/^\w{5,15}$/.test(f.userid.value))){
alert("用户ID必须是5-15位!");
f.userid.focus();
return flase;
}
if (!(/^\w{5,15}$/.test(f.password.value))){
alert("密码必须是5-15位!");
f.password.focus();
return flase;
}
}
</script>
<body>
<h2>用户登录程序</h2>
<% request.setCharacterEncoding("GBK");%>
<%
List<String> info = (List<String>)request.getAttribute("info"); // 取得属性
if (info != null){
Iterator<String> iter = info.iterator();
while (iter.hasNext()){
%>
<h4><%=iter.next()%></h4>
<%
}
}
%>
<form action= "LoginServlet" method= "post" onSubmit="retrun validate(this)">
用户ID<input type="text" name="userid"><br>
密 码<input type="password" name="password"><br>
<input type="submit" value="登录">
<input type="reset" value="重置">
</form>
</body>
<html>
Web.xml配置文件
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>
zz.servlet.LoginServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
错误:
1、虽然之前的文件全部编译通过,但在DAOFactory.java编译出错:
DAOFactory.java:6: 不兼容的类型
找到: zz.dao.proxy.UserDAOProxy
需要: zz.dao.IUserDAO
return new UserDAOProxy(); // 返回代理类实例
^
1 错误
MLDN李祺老师一针见血指出我的错误:
“检查你的UserDAOProxy是否实现了IUserDAO接口”
教训:编译检查调试看包的导入情况也要看接口的实现!
2、找错误找的吐血,不可能出现的错误,但不同目录上的文件啊!!!
修改的是一个文件,编译的是另外一个目录下的文件
Webdemo目录下
和Web-Inf/Classes目录下
当然因为用的是EditPlus编译,如果用IDE,是不会犯这种错误的,但凡事有利有弊,用这种记事本编译更能体会很多运行细节,这是用太依赖IDE的人不能比的。
3、Loging.jsp文件编译错误:
<form action= "LoginServlet" method= "post" onSubmit="retrun validate(this)"> |
<% request.setCharacterEncoding("GBK");%><!—缺少分号;--> |
<form action="LoginServlet.jsp" method= "post" onSubmit=" return validate(this)">
4、Tomcat后台错误:
java.lang.ClassNotFoundException:DBDRIVER
……….
java.lang.NullPointerException
……….
原因:
try{
Class.forName(“DBDRIVER”); // 加载驱动,不要分号!
this.conn = DriverManager.
getConnection(DBURL, DBUSER, DBPASSWORD); // 连接数据库
}catch (Exception e){
throw e;
}
界面效果图: