Struts+DAO框架搭建完成!(源码)

今天做了这个Struts+DAO框架,可以说是又向SSH迈了一步。
 
做的过程中又发现了一些问题,但是在我和其他人的努力下一起解决了。这个问题是MyEclipse的Tomcat的启动问题。(已经解决并发帖解答了)

好了,下面切入正题:

Struts+DAO框架实现用户登录。(连接MYSQL数据库)

环境:MyEclipse

步骤:

1.新建WebProject,命名为LoginProject,点击确定

2.给项目加入Struts支持,Add Struts Capabilities....,选Struts1.2,Base package for new classes:命名为cn.mldn.lxh.struts,完成

3.src下新建一个类,名为PersonVO,放在org.lxh.vo,完成,写入代码如下:

// 只包含setter和getter方法的类

package org.lxh.vo ;

import java.util.* ;
public class PersonVo
{
 // 表中所有字段
 private String id ;
 private String name ;
 private String password ;
 // 此属性用于保存全部错误信息
 private List errors ;

 public boolean invalidate()
 {
  boolean flag = true ;
  // 验证ID
  if(this.id==null||"".equals(this.id))
  {
   flag = false ;
   errors.add("ID不能为空!") ;
  }
  else
  {
   // 进行长度验证:3~10位
   if(this.id.length()<3||this.id.length()>10)
   {
    flag = false ;
    errors.add("ID的长度应为3~10位!") ;
   }
  }
  // 验证密码
  if(this.password==null||"".equals(this.password))
  {
   flag = false ;
   errors.add("密码不能为空!") ;
  }
  else
  {
   // 进行长度验证:3~10位
   if(this.password.length()<3||this.password.length()>10)
   {
    flag = false ;
    errors.add("密码的长度应为3~10位!") ;
   }
  }
  return flag ;
 }

 public void setErrors(List errors)
 {
  this.errors = errors ;
 }
 public List getErrors()
 {
  return this.errors ;
 }

 // 生成getter和setter方法
 public void setId(String id)
 {
  this.id = id ;
 }
 public void setName(String name)
 {
  this.name = name ;
 }
 public void setPassword(String password)
 {
  this.password = password ;
 }
 public String getId()
 {
  return this.id ;
 }
 public String getName()
 {
  return this.name ;
 }
 public String getPassword()
 {
  return this.password ;
 }
};

4.src下新建一个类,名为DAOFactory,包名为org.lxh.factory,完成,写入代码:

// 取得DAO实例的工厂类

package org.lxh.factory ;

import org.lxh.dao.* ;
import org.lxh.daoimpl.* ;

public class DAOFactory
{
 public static PersonDAO getPersonDAOInstance()
 {
  return new PersonDAOImpl() ;
 }
};

5.src下新建类,名为DateBaseConnection,包名org.lxh.dbc,完成,写入代码:

// 本类只用于数据库连接及关闭操作
package org.lxh.dbc ;

import java.sql.* ;

public class DataBaseConnection
{
 // 属性
 // 定义数据库操作的常量、对象
 // 数据库驱动程序
 private final String DBDRIVER = "com.mysql.jdbc.Driver" ;
 // 数据库连接地址
 private final String DBURL  = "jdbc:mysql://localhost:3306/people" ;
 // 数据库用户名
 private final String DBUSER  = "root" ;
 // 数据库连接密码
 private final String DBPASSWORD = "hicc" ;
 // 声明一个数据库连接对象
 private Connection conn   = null ;

 // 在构造方法之中连接数据库
 public DataBaseConnection()
 {
  try
  {
   // 加载驱动程序
   Class.forName(DBDRIVER) ;
   // 连接数据库
   conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; 
  }
  catch (Exception e)
  {
   System.out.println(e) ;
  }
 }

 // 返回一个数据库连接
 public Connection getConnection()
 {
  /// 返回连接对象
  return this.conn ;
 }

 // 关闭数据库连接
 public void close()
 {
  try
  {
   this.conn.close() ;   
  }
  catch (Exception e)
  {
  }
 }
};

6.src下新建类,名为PersonDAOImpl,包名为org.lxh.daoimpl,完成。写入代码如下:

// 具体实现DAO接口的类

package org.lxh.daoimpl ;

// 需要连接数据库
// 需要对VO的内容进行具体的验证
import java.sql.* ;
import org.lxh.dao.* ;
import org.lxh.dbc.* ;
import org.lxh.vo.* ;

public class PersonDAOImpl implements PersonDAO
{
 public boolean isLogin(PersonVo pv)
 {
  boolean flag = false ;
  // 在此处成具体的数据库验证

  // 声明一个数据库操作对象
  PreparedStatement pstmt = null ;
  // 声明一个结果集对象
  ResultSet rs   = null ;
  // 声明一个SQL变量,用于保存SQL语句
  String sql    = null ;
  // DataBaseConnection为具体的数据库连接及关闭操作类
  DataBaseConnection dbc = null ;
  // 连接数据库
  dbc = new DataBaseConnection() ;

  // 编写SQL语句
  sql = "SELECT name FROM person WHERE id=? and password= ?" ;
  try
  {   
   // 实例化数据库操作对象
   pstmt = dbc.getConnection().prepareStatement(sql) ;

   // 设置pstmt的内容,是按ID和密码验证
   pstmt.setString(1,pv.getId()) ;
   pstmt.setString(2,pv.getPassword()) ;

   // 查询记录
   rs = pstmt.executeQuery() ;
   // 判断是否有记录
   if(rs.next())
   {
    // 如果有记录,则执行此段代码
    // 用户是合法的,可以登陆
    flag = true ;
    pv.setName(rs.getString(1)) ;
   }
   // 依次关闭
   rs.close() ;
   pstmt.close() ;
  }
  catch(Exception e)
  {
   System.out.println(e) ;
  }
  finally
  {
   // 最后一定要保证数据库已被关闭
   dbc.close() ;
  }
  return flag ;
 }

7.src下新建PersonDAO,包名org.lxh.dao

// 本接口定义本项目中所操作person表的全部方法

package org.lxh.dao ;

// 使用PersonVo类
import org.lxh.vo.* ;

public interface PersonDAO
{
 // 需要一个登陆验证的方法
 public boolean isLogin(PersonVo pv) ;
}

8.WebRoot下新建文件,命名为数据库创建脚本.sql,完成写入内容,如下:

DROP TABLE person ;

CREATE TABLE person
(
 id varchar(20) not null primary key ,
 name varchar(20) not null ,
 password varchar(20)
) ;

INSERT INTO person (id,name,password) VALUES ('lxh','LiXingHua','ffffff') ;
INSERT INTO person (id,name,password) VALUES ('mldn','mole','mldn') ;

-- 提交事务
commit ;

9.WebRoot下新建两个JSP页面,分别命名为,login和login_success。完成,写入代码:

login.jsp

<%@page contentType="text/html;charset=gb2312"%>
<%@page import="java.util.*"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>

<html>
<head>
 <title>登陆</title>
</head>
<body>
<center>
 <h1>登陆范例――Struts实现</h1>
 <hr>
 <br>
 <br>
 <!-- 加入更加详细的错误提示 -->
 <html:errors/>
 
 <html:form action="login.do" method="post">
 <table>
  <tr>
   <td colspan="2">用户登陆</td>
  </tr>
  <tr>
   <td>用户名:</td>
   <td><html:text property="id"/></td>
  </tr>
  <tr>
   <td>密&nbsp;&nbsp;码:</td>
   <td><html:password property="password"/></td>
  </tr>
  <tr>
   <td colspan="2">
   <html:submit value="登陆"/>
   <html:reset value="重置"/>
   </td>
  </tr>
 </table>
 </html:form>
 </center>
</body>
</html>

login_success.jsp

<%@page contentType="text/html;charset=gb2312"%>
<html>
<head>
 <title>登陆</title>
</head>
<body>
<center>
 <h1>登陆范例――Struts实现</h1>
 <hr>
 <br>
 <br>
 <h2>登陆成功</h2>
 <h3>欢迎<font color="red" size="15">
  ${person.name}
 </font>光临!!!</h3>
</center>
</body>
</html>


10.插入ActionForm和Form的方法。在src下建立,在菜单空白处点右键,选自定义透视图,添加方法,add name和password。

11.修改Struts配置文件,最终代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="loginForm" type="cn.mldn.lxh.struts.form.LoginForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="loginForm"
      input="/login.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      type="cn.mldn.lxh.struts.action.LoginAction">
      <forward name="suc" path="/login_success.jsp"></forward>
   </action>

  </action-mappings>

  <message-resources parameter="cn.mldn.lxh.struts.ApplicationResources" />
</struts-config>

12.在资源文件ApplicationResources.properties中写入代码:实现错误提示。

 # Resources for parameter 'cn.mldn.lxh.struts.ApplicationResources'
# Project P/LoginProject
id.null = <li>\u7528\u6237ID\u80fd\u4e3a\u7a7a\uff01\uff01\uff01
password.null = <li>\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01\uff01\uff01
error.login = <li>\u9519\u8bef\u7684\u7528\u6237\u540d\u6216\u5bc6\u7801\uff01\uff01\uff01


13.编辑LoginForm.java,代码如下:

/**
 * MyEclipse Struts
 * Creation date: 12-14-2006
 *
 * XDoclet definition:
 * @struts.form name="loginForm"
 */
public class LoginForm extends ActionForm {
 /*
  * Generated fields
  */

 /** password property */
 private String password;

 /** name property */
 private String id;

 /*
  * Generated Methods
  */

 /**
  * Method validate
  * @param mapping
  * @param request
  * @return ActionErrors
  */
 public ActionErrors validate(ActionMapping mapping,
   HttpServletRequest request) {
  // TODO Auto-generated method stub
  ActionErrors errors = new ActionErrors() ;
  if(this.id==null||"".equals(this.id))
  {
   errors.add("name",new ActionMessage("id.null")) ;
  }
  if(this.password==null||"".equals(this.password))
  {
   errors.add("password",new ActionMessage("password.null")) ;
  }
  return errors;
 }

 /**
  * Method reset
  * @param mapping
  * @param request
  */
 public void reset(ActionMapping mapping, HttpServletRequest request) {
  // TODO Auto-generated method stub
 }

 /**
  * Returns the password.
  * @return String
  */
 public String getPassword() {
  return password;
 }

 /**
  * Set the password.
  * @param password The password to set
  */
 public void setPassword(String password) {
  this.password = password;
 }

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }
}

14.编辑LoginAction.java,代码如下:

* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.mldn.lxh.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.lxh.factory.DAOFactory;
import org.lxh.vo.PersonVo;

import cn.mldn.lxh.struts.form.LoginForm;

/**
 * MyEclipse Struts
 * Creation date: 12-14-2006
 *
 * XDoclet definition:
 * @struts.action path="/login" name="loginForm" input="/form/login.jsp" scope="request" validate="true"
 */
public class LoginAction extends Action {
 /*
  * Generated Methods
  */

 /**
  * Method execute
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
  String id = loginForm.getId() ;
  String password = loginForm.getPassword() ;
  PersonVo per = new PersonVo();
  per.setId(id) ;
  per.setPassword(password) ;
  System.out.println(DAOFactory.getPersonDAOInstance().isLogin(per));
  if(DAOFactory.getPersonDAOInstance().isLogin(per))
  {
   // 用户ID和密码合法
   request.setAttribute("person",per) ;
  }
  else
  {
   // 错误,要回到login.jsp页面
   ActionMessages errors = new ActionMessages() ;
   errors.add("error",new ActionMessage("error.login")) ;
   super.saveErrors(request, errors) ;
   return mapping.getInputForward() ;
  }
  return mapping.findForward("suc");
 }
}

15.启动MyEclipse中的Tomcat。运行项目。完成

施杨出品!!!
















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP1.1中CHUNKED编码解析(转载)

HTTP1.1中CHUNKED编码解析 一般HTTP通信时&#xff0c;会使用Content-Length头信息性来通知用户代理&#xff08;通常意义上是浏览器&#xff09;服务器发送的文档内容长度&#xff0c;该头信息定义于HTTP1.0协议RFC 1945 10.4章节中。浏览器接收到此头信息后&#xff0c;接受…

解析可变参数函数的实现原理(printf,scanf)

From: http://hi.baidu.com/huifeng00/blog/item/085e8bd198f46ed3a8ec9a0b.html 学习C的语言的时候&#xff0c;肯定接触到标准输出和标准输入函数。 这个函数给人的感觉很强大&#xff0c;因为它很另类&#xff0c;就是这个函数的参数是可变的。 下面是一个自己编写的可变…

花生葫芦球 健身新运动

国民健康天后张淳淳老师率先再将风靡欧美的“花生葫芦球(FITNESS BALL)”&#xff0c;推广给日、港、台的朋友&#xff0c;同时结合国内外体适能教练与专家&#xff0c;研发出一套减压、塑身运动课程&#xff0c;引领全民健康塑身运动。 花生葫芦球 健身新运动美大腿后健肌群伸…

JS之数组元素排序方法sort

作用&#xff1a;sort() 方法用于对数组的元素进行排序 语法&#xff1a;arrayObject.sort(sortby) 参数&#xff1a;可选。规定排序顺序。必须是函数 返回值&#xff1a;对数组的引用。请注意&#xff0c;数组在原数组上进行排序&#xff0c;不生成副本 注意1&#xff1a;…

js中自己实现bind函数的方式

前言 最近由于工作比较忙&#xff0c;好久都没时间静下心来研究一些东西了。今天在研究 call 和 apply 的区别的时候&#xff0c;看到 github 上面的一篇文章&#xff0c;看完以后&#xff0c;感觉启发很大。 文章链接为 https://github.com/lin-xin/blog/issues/7 &#xff…

我的C语言可变参数的实现

实现环境&#xff1a;Fedora12 gcc 任务&#xff1a;用C语言实现一个参数可变的函数&#xff0c;以方便输出。 源代码如下&#xff1a; #include <stdio.h>#include <stdarg.h>#include <string.h>int sum(int data, ...){int i data, s 0;va_list vl;…

Leetcode刷题(1)两数之和

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中…

使用WEB方式更改域用户帐户密码

使用WEB方式更改域用户帐户密码 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1、这个只是域帐户密码的一种更改方式&#xff0c;正规来说&#xff0c;域用户帐户的密码更改方式可以有6种。今天介绍给大家的只是其中一种&…

一个路径下挂载(匹配)多个子组件

效果图如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Document</title><script type"text/javascript" src"./lib/vue-2.4.0.js"></script><scrip…

JS之字符串截取函数substr

作用&#xff1a;substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符 语法&#xff1a;stringObject.substr(start,length) 参数1&#xff1a;必需。要抽取的子串的起始下标。必须是数值。如果是负数&#xff0c;那么该参数声明从字符串的尾部开始算起的位置。…

面向对象中的修饰关键词

final:用来修饰类和方法&#xff0c;修饰类的时候表示这个类是终极类&#xff0c;不能被其他类继承&#xff0c;修饰方法的时候&#xff0c;表示这个方法是终极方法&#xff0c;不能被子类重写。 static:用来修饰属性和方法&#xff0c;修饰属性的时候表示这个属性是静态属性&a…

GDB命令大全

GDB的使用   当程序出错并产生core 时   快速定位出错函数的办法   gdb 程序名 core文件名(一般是core,也可能是core.xxxx)   调试程序使用的键   r run 运行.程序还没有运行前使用   c cuntinue 继续运行。运行中断后继续运行   q 退出   kill 终止调…

Leetcode刷题(2)回文数

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &…

ZT Web Control 开发系列(一) 页面的生命周期

http://www.cnblogs.com/joeliu/category/143125.htmlPage是WebForm编程基本元素&#xff0c;它从TemplateControl派生&#xff0c;而TemplateControl又从Control派生&#xff0c;所以Page实际就是一个Control。同时Page也实现了IHttpHandler接口&#xff0c;所以它可以接受Htt…

计算属性computed的使用

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Document</title><script type"text/javascript" src"./lib/vue-2.4.0.js"></script></head>…

JS之字符串截取方法substring

作用&#xff1a;substring() 方法用于提取字符串中介于两个指定下标之间的字符 语法&#xff1a;stringObject.substring(start,stop) 参数1&#xff1a;必需。一个非负的整数&#xff0c;规定要提取的子串的第一个字符在 stringObject 中的位置 参数2&#xff1a;可选。一…

gdb命令手册

GDB 的命令很多&#xff0c;本文不会全部介绍&#xff0c;仅会介绍一些最常用的。在介绍之前&#xff0c;先介绍GDB中的一个非常有用的功能&#xff1a;补齐功能。它就如同Linux下SHELL中的命令补齐一样。当你输入一个命令的前几个字符&#xff0c;然后输入TAB键&#xff0c;如…

HTML5增加的几个新的标签

HTML5又2008年诞生&#xff0c;HTML5大致可以等同于htmlcss3javascriptapi.... so --->支持css3强大的选择器和动画以及javascript的新的函数 先来记录一下吧&#xff01; 1。 <canvas>画布标签 HTML5的新标签 举例&#xff1a; 1 <html>2 <head>3 …