基于springmvc spring ioc + mybatis 的web项目搭建

距离我第一篇博客已经是去年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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring MVC是基于Spring框架的一种Web框架,用于开发Java Web应用程序。而Spring是一个轻量级的IoC(Inverse of Control)和AOP(Aspect-Oriented Programming)容器,通过IOC容器,可以管理各种Java Bean的生命周期和依赖关系,而通过AOP可以实现一些跨越多个模块或对象的通用功能。 MyBatis是一个持久层框架,它可以将数据库操作抽象为Java接口的方法,通过配置文件将这些方法映射到相应的SQL语句,实现轻量级的数据库访问。 SpringMVCSpringMyBatis可以结合使用来开发一个完整的Java Web项目。 在一个典型的SpringMVCSpringMyBatis项目中,通常会有以下几个主要组件: 1. 控制器(Controller):负责接收用户的请求,处理业务逻辑,并返回相应的结果。SpringMVC提供了很多注解和接口,可以很方便地定义和处理请求。 2. 服务(Service):负责处理具体的业务逻辑。通常一个服务类会对应一个或多个DAO(Data Access Object),通过DAO对象访问数据库,获取或修改数据。 3. DAO(Data Access Object):负责封装与数据库交互的细节。通过使用MyBatis的映射文件,将Java接口的方法映射到相应的SQL语句。 4. 数据库:使用关系型数据库(如MySQL、Oracle等)存储持久化数据。 在项目中,通过配置文件和注解,将这些组件关联起来。Spring框架负责管理各个组件的生命周期和依赖关系,MyBatis提供数据访问功能,SpringMVC负责接收用户请求并将结果返回给用户。 通过SpringMVCSpringMyBatis的结合,可以实现一个完整的Java Web项目,使开发者能够更加方便、高效地进行开发,并且能够更好地实现各个组件之间的解耦和复用。 ### 回答2: springmvc spring mybatis是一种常见的Java Web开发框架组合,被广泛应用于企业级的Web应用程序开发中。下面以一个简单的项目实例来介绍其基本用法。 假设我们要开发一个简单的学生信息管理系统,使用springmvc来搭建前端控制器,spring来进行依赖注入和事务管理,mybatis作为持久层框架与数据库交互。 首先,我们需要进行项目的初始化配置。在Spring配置文件中,配置相关的bean以及包扫描路径,使得框架能够自动扫描并管理相应的组件。 接下来,我们创建相应的实体类,例如学生类,可以定义属性如姓名、年龄等,并使用注解进行实体类与数据库表的映射。同时,我们可以创建DAO接口和Mapper映射文件,用于扩展mybatis的CURD操作。 然后,我们在Controller中编写处理请求的方法,通过注解标识URL映射关系、请求类型,使用Service层的方法进行业务处理,并将结果传递给视图解析器进行渲染。 在Service层,我们可以编写相应的逻辑代码,例如添加、删除、修改学生信息等。同时,我们可以利用@Autowired注解将DAO层的方法注入到Service中,从而将数据库操作与业务逻辑进行分离。 最后,我们可以在视图层创建相应的页面,例如添加、删除、修改学生信息的页面。利用EL表达式和JSTL标签库等,实现数据的展示和交互。 总的来说,springmvc spring mybatis的项目实例中,我们通过配置框架的相关组件,编写实体类、映射文件以及相应的控制器、服务层和视图层代码,从而实现了一个简单的学生信息管理系统。通过这个实例,我们可以更好地理解和掌握springmvc spring mybatis的基本用法和项目架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值