在前面demo的基础上再做一个涉及数据库访问,分层结构的简单用户登录注册例子,步骤如下:
1.新建user表,sql语句如下
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`name` char(128) NOT NULL,
`credits` int(11) default '0',
`password` varchar(32) NOT NULL,
`last_visit` datetime default NULL,
`last_ip` varchar(23) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
2.新建注册页面register.jsp,登录的页面还是前面的index.jsp,两者很相似
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'register.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="Register" method="post">
<Table>
<Tr>
<td>用户名:</Td>
<td><input type="text" name="username" /></Td>
</Tr>
<Tr>
<td>密码:</Td>
<td><input type="password" name="password" /></Td>
</Tr>
<Tr>
<td><input type="submit" name="submit" value="注册"/></Td>
<td><input type="reset" name="reset" value="重置"/></Td>
</Tr>
</Table>
</form>
</body>
</html>
3.导入所需要的包mysql-connector-java(jdbc驱动),spring里的jdbc,transaction包,commoms-dbcp,commons-pool(两者配合使用完成数据库连接池),导入完成后要在spring配置文件中进行配置,配置文件在后面给出
4.由于用户注册需对密码进行md5加密,所以先给出md5加密的工具类Md5Encode.java,此文件为网上看到的,直接拿来用的
package com.struts2.util;
import java.security.MessageDigest;
public class Md5Encode {
private final static String[] hexDigits={
"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
public static String byteArrayToHexString(byte[] b){
StringBuffer resultSb=new StringBuffer();
for(int i=0;i<b.length;i++){
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b){
int n=b;
int d1=0;
int d2=0;
if(n<0){
n=256+n;
d1=n/16;
d2=n%16;
}
return hexDigits[d1]+hexDigits[d2];
}
public static String MD5Encode(String origin){
String resultString=null;
try{
resultString=new String(origin);
MessageDigest md=MessageDigest.getInstance("MD5");
resultString=byteArrayToHexString(md.digest(resultString.getBytes()));
}catch(Exception e){
}
return resultString;
}
}
5.在程序里添加dao,model与service(前面例子已经添加过)
加好后,先在model package里加入实体类Usre.java
package com.struts2.model;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private int uid;
private String username;
private String password;
private int credits;
private String lastIp;
private Date lastVisit;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getCredits() {
return credits;
}
public void setCredits(int credits) {
this.credits = credits;
}
public String getLastIp() {
return lastIp;
}
public void setLastIp(String lastIp) {
this.lastIp = lastIp;
}
public Date getLastVisit() {
return lastVisit;
}
public void setLastVisit(Date lastVisit) {
this.lastVisit = lastVisit;
}
}
dao与Service里最好加上接口包,在这里,我只在dao里加了接口包,并在里面写了dao接口类IUserDao.java
package com.struts2.dao.impl;
import com.struts2.model.User;
public interface IUserDao {
public void addUser(User user);
public void delUser(User user);
public User findUserByName(String username);
public void updateUser(User user);
public boolean checkUser(String username,String password);
public boolean register(User user);
}
下面是实现接口的UserDao.java
package com.struts2.dao;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import com.struts2.dao.impl.IUserDao;
import com.struts2.model.User;
public class UserDao implements IUserDao {
private JdbcTemplate jdbcTemplate;
//注入
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void addUser(User user) {
// TODO Auto-generated method stub
}
public void delUser(User user) {
// TODO Auto-generated method stub
}
public User findUserByName(String username) {
// TODO Auto-generated method stub
return null;
}
public void updateUser(User user) {
// TODO Auto-generated method stub
}
public boolean checkUser(String username, String password) {
// TODO Auto-generated method stub
System.out.println(password);
String sql="select count(*) from user where name=? and password=? ";
int count=jdbcTemplate.queryForInt(sql,new Object[]{username,password});
return count>0;
}
public boolean register(User user) {
// TODO Auto-generated method stub
System.out.println("beign dao");
String sql="insert into user (name,credits,password,last_visit,last_ip) values (?,?,?,?,?)";
Object[] args={user.getUsername(),user.getCredits(),user.getPassword(),user.getLastVisit(),user.getLastIp()};
try{
jdbcTemplate.update(sql, args);
}catch (DataAccessException e)
{
e.printStackTrace();
return false;
}
return true;
}
}
有些方法加上了,没实现,其中对数据库的操作是使用了spring里封装的jdbc
最后就是Service了,我把登录和注册写成了两个Service类,好的做法应该写成一个UserService类,里面写两个方法就可以了
既然写了两个文件,就都贴出来吧
LoginService.java
package com.struts2.service;
import com.struts2.dao.UserDao;
import com.struts2.model.User;
public class LoginService {
private UserDao userdao;
public boolean login(User user) throws Exception{
boolean flag=false;
if(userdao.checkUser(user.getUsername(), user.getPassword())){
flag=true;
}
return flag;
}
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
}
}
RegisterService.java
package com.struts2.service;
import com.struts2.dao.UserDao;
import com.struts2.model.User;
public class RegisterService {
private UserDao userDao;
public boolean Register(User user){
System.out.println("begin Service");
return userDao.register(user);
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
6.在编写完分层后,添加ReigsterAction.java并修改前面的LoginAction.java
RegisterAction.java
package com.struts2.action;
import java.util.Date;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.struts2.model.User;
import com.struts2.service.RegisterService;
import com.struts2.util.Md5Encode;
import org.apache.struts2.ServletActionContext;
public class RegisterAction extends ActionSupport implements Action{
private String username;
private String password;
private RegisterService registerService;
public String execute() throws Exception{
System.out.println("begin action");
User user=new User();
user.setUsername(username);
user.setPassword(Md5Encode.MD5Encode(password));
user.setCredits(10);
user.setLastVisit(new Date());
user.setLastIp(ServletActionContext.getRequest().getRemoteAddr());
if(this.registerService.Register(user)){
return this.SUCCESS;
} else{
return this.ERROR;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setRegisterService(RegisterService registerService) {
this.registerService = registerService;
}
}
LoginAction.java
package com.struts2.action;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.struts2.model.User;
import com.struts2.service.LoginService;
import com.struts2.util.Md5Encode;
public class LoginAction extends ActionSupport implements Action{
private static final long serialVersionUID = 1L ;
private String username;
private String password;
private LoginService loginService;
@Override
public void validate()
{
}
public String execute() throws Exception
{
User user=new User();
user.setUsername(username);
user.setPassword(Md5Encode.MD5Encode(password));
boolean result=this.loginService.login(user);
if(result){
return this.SUCCESS;
}else{
return this.ERROR ;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public LoginService getLoginService() {
return loginService;
}
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
}
7.配置struts.xml,配置新的action
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<constant name="struts.objectFactory" value="spring"></constant>
<package name="strutsqs" extends="struts-default">
<action name="Login" class="com.struts2.action.LoginAction">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="Register" class="com.struts2.action.RegisterAction">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
8.最后给出最重要的spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/spring"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!-- 定义Spring JDBC模板类bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- dao -->
<bean id="userDao" class="com.struts2.dao.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate" ></property>
</bean>
<!-- service -->
<bean id="registerService" class="com.struts2.service.RegisterService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="loginService" class="com.struts2.service.LoginService">
<property name="userdao" ref="userDao"></property>
</bean>
<!-- action -->
<bean id="login" class="com.struts2.action.LoginAction">
<property name="loginService" ref="loginService"></property>
</bean>
<bean id="register" class="com.struts2.action.RegisterAction">
<property name="registerService" ref="registerService"></property>
</bean>
</beans>
从上面明显可以看出层之间的依赖关系,action-->service-->dao--->jdbc模板--->数据源