距离我第一篇博客已经是去年7月份的事情了...
这段时间都没什么心情写博客,也没时间。今天终于闲了下来,准备再来一发!
上次写的是ssh项目,今天准备搭个ss项目,web层将由spring mvc来完成 ; 中间层由 spring ioc ; 数据库操作由mybatis
而且采用xml + annotation的方式 项目更加灵活 , 这种架构也是本人最喜欢的一种方式
背景还是以一个简单的用户管理系统,我这里重点讲的是项目的构建,而非业务处理,所以业务用最简单的 .
基本的流程是实现一个user的登录流程。
先让大伙瞅瞅最终项目的结构
项目打包放在 这里
bean :存放表的实体映射,dao:数据操作,service:业务操作,web:存放web层各个组件,这里只有action,自己可以再扩展,例如自定义标签,可以在web下面新建tag包
conf : 存放项目的配置文件
先建个简单的数据库,如图:
表非常简单,3个字段(密码没经过任何加密处理,这里随意点而已..)
准备好Jar 如图:
比ssh少了很多
先从bean方面下手,第一步做好实体映射,在bean下面新建 类User 上码:
package org.uc.bean;
public class User {
private int id;
private String uname;
private String upass;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
}
</pre>之后,在src下,新建Mybatis的配置文件SqlMapConfig.xml 上码:<p></p><pre code_snippet_id="347076" snippet_file_name="blog_20140515_2_1321373" name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="User" type="org.uc.bean.User" />
</typeAliases>
<mappers>
<mapper resource="org/uc/conf/User.xml"/>
</mappers>
</configuration>
因为有了spring,mybatis的sqlsessionfactory给ioc托管,原本要在Mybatis的配置文件SqlMapConfig.xml配置数据库的各种信息,现在要去spring的配置文件配置,所以Mybatis的配置文件SqlMapConfig.xml代码少了很多,只要加载映射文件,和配置一些次要的信息。
接着在conf下面建立User对应的mapper文件 User.xml 上码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.uc.bean.User">
<select id="getOneByProperty" resultType="User" parameterType="User">
SELECT * FROM `user`
<where>
<if test="id != 0">
id = #{id}
</if>
<if test="uname != null">
AND uname = #{uname}
</if>
<if test="upass != null">
AND upass = #{upass}
</if>
</where>
</select>
</mapper>
包含了一个简单的查询方法,根据传进来的User判断它的属性 进行动态的查询,Mybatis不熟悉的同学,好好去看看
接下来核心部分才刚刚开始,src下新建applicationConext.xml 为spring的配置文件,先上码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 配置mybatis的sqlsessionfactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
</bean>
<!-- 配置spring mvc -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/> <!-- 指定视图的存放文件夹 在WebRoot下的jsp文件夹 -->
<property name="suffix" value=".jsp"/><!--指定视图后缀名 可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
</bean>
<!-- 让spring自动去扫org.cu下面的所有可以被ioc注入的类 -->
<context:component-scan base-package="org.uc"/>
<!-- 启用mvc注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置数据源 这边我用c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/umc"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!-- 配置事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置各个方法采用什么样的事务管理方式 -->
<tx:advice id="my_advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="list*" read-only="true" />
<tx:method name="query*" read-only="true" />
<tx:method name="load*" read-only="true" />
<tx:method name="*" rollback-for="Throwable" />
</tx:attributes>
</tx:advice>
<!-- 利用aop把上面配置好的事务加到 service包下面-->
<aop:config>
<aop:pointcut id="my_pointcut" expression="(execution(* org.uc.service..*.*(..)))" />
<aop:advisor pointcut-ref="my_pointcut" advice-ref="my_advice" />
</aop:config>
</beans>
主要是配置三大部分 数据源 、事务、spring mvc
好了配置方面大部分已经完成,开始编码了,先从dao层开始,这里我先在dao下面新建一个BaseDao主要作用在于封装一些通用方法,所有子Dao类继承之即可,上码:
package org.uc.dao;
import javax.annotation.Resource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Scope("prototype")//这里scope采用prototype 保证每一次请求都有一个新的BaseDao
@Repository//用于标注数据访问组件,即DAO组件
public class BaseDao extends SqlSessionDaoSupport{
@Resource //这里指明sqlSessionFactory需要注入,因为我们在applicationContext.xml里面写了一个sqlSessionFactory需要注入
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
//再次封装了父类的方法 子类不需要再getSqlSession()
public Object selectOne(String statementName,Object parameterObject){
return this.getSqlSession().selectOne(statementName, parameterObject);
}
}//还有很多方法,这里不一一列出,自己随意扩展,记得先要getSqlSession
父Dao先这样,开始编写属于User的Dao层,同样在dao下面新建一个接口 IUserDao, 上码:
package org.uc.dao;
import org.uc.bean.User;
public interface IUserDao {
public User getOneByProperty(User user);
}
接口非常简单,一个方法需要待会的Dao实现类实现,在dao.impl包下新建UserDaoImpl 上码:
package org.uc.dao.impl;
import org.springframework.stereotype.Repository;
import org.uc.bean.User;
import org.uc.dao.BaseDao;
import org.uc.dao.IUserDao;
@Repository //这里也需要标注 该类属于Dao组件
//继承我刚刚编码的BaseDao和IUserDao
public class UserDaoImpl extends BaseDao implements IUserDao{
//重写并实现getOneByProperty方法
public User getOneByProperty(User user) {
return (User) this.selectOne("org.uc.bean.User.getOneByProperty", user);
}
}
------------------------------------------------------------------------Dao层到此-------------------------------------------------------------------
开始service业务层,service跟dao差不多,我说差不多的意思是流程上一样的。
先在service下新建IUserService 上码:
package org.uc.service;
import org.uc.bean.User;
public interface IUserService {
public User getUserByProperty(User user);
}
再来是 service.impl下面新建UserServiceImpl
package org.uc.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.uc.bean.User;
import org.uc.dao.IUserDao;
import org.uc.service.IUserService;
@Service//标注该类属于 Service组件
public class UserServiceImpl implements IUserService{
@Resource
private IUserDao userDao;//标注该接口需要注入
@Override
public User getUserByProperty(User user) {
//这里编码业务逻辑代码...
return userDao.getOneByProperty(user);
}
}
-----------------------------------------------------------service到此----------------------------------------------------
剩下action了,在web.action下新建UserAction 上码:
package org.uc.web.action;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.uc.bean.User;
import org.uc.service.IUserService;
@Controller//标注该类为控制器
@RequestMapping("/user")//设置该action的请求映射,相当于struts2的namespace
public class UserAction {
@Resource//注入userService
private IUserService userService;
//设置该方法的请求映
@RequestMapping("/login")
public ModelAndView userLogin(String op,User user){
if(null==op || op.equals("init")){
return new ModelAndView("login");
}
else if(op.equals("login")){
User result = userService.getUserByProperty(user);
if(result!=null){
System.out.println("login success");
return new ModelAndView("index","user",user);
}
}
return new ModelAndView("error");
}
}
用过spring mvc的同学自然看得明白,这里不再描述,自己google吧。
--------------------------------------------------------------------------action到此-------------------------------------------------------------
最后我们建几个jsp页面来进行测试。
首先 login.jsp 在Webroot下面的jsp文件夹 上码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login</title>
</head>
<body>
<form action="login.do?op=login" method="post">
uname : <input type="text" name="uname"/><br/>
upass : <input type="password" name="upass"/><br/>
<input type="submit" value="Login"/>
</form>
</body>
</html>
表单请求到我们刚刚编写的action的userLogin方法,在action里面如果登录成功跳转到index.jsp页面输出登录用户名,页面如下:
<%@page import="org.uc.bean.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index</title>
</head>
<body>
welcome ! ${user.uname }
</body>
</html>
登录失败 ,跳转到error.jsp页面 上码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>error</title>
</head>
<body>
Login error
</body>
</html>
好了,最后我们加上log4j就完成了,log4j通过配置后,我们还可以在后台看清楚mybatis的sql语句,调试方便了很多,当然log4j不只这个功能。。在src下新建log4j.properties
上码:
log4j.rootLogger=debug,stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=jbit.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
好了,放到Tomcat里面吧。 访问 http://localhost:8080/uc/user/login,将会跳转到login.jsp页面
界面略丑,,将就吧。输入 Eafon 123
登录成功
随便输一个错误的。
好吧,大功告成。整个系统,包括数据库,打包放在资源
http://download.csdn.net/detail/eafon/7351373