最近写的一个三层框架:Springmvc3+Spring3+MyBatis3,后来,在Web层和Service层之间加了一个门面层,前台模块跟Web层的Controller类是对应的,Controller与门面层的类是一一对应的,在门面类中可以添加所需要的Server层所需的接口。
1. 项目的目录
2. 所用jar文件
3. 在MyEclipse创建Web工程
4. 修改/WebRoot/WEB-INF/Web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 加载Spring容器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <!-- 配置Spring mvc核心控制器 --> <servlet> <servlet-name>spring</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 解决工程编码过滤器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
5. 创建 Spring MVC配置文件 /WebRoot/WEB-INF/spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射--> <mvc:annotation-driven /> <!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean --> <context:component-scan base-package="com.smartcom.esp.web" /> <!-- 动态页面配置--> <bean id="loginController" class="com.smartcom.esp.web.LoginController"> <property name="formView" value="esp/error"/> <property name="succView" value="esp/main"/> </bean> <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
6. 创建页面:/WebRoot/login.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>Login</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"> </head> <body> <form action="login"> <div> <div>UserName:<input type="text" value="" name="username"></div> <div>Password:<input type="password" value="" name="password"></div> <div><input type="reset" value="取消"> <input type="submit" value="提交"></div> </div> </form> </body> </html>
7. 创建页面:/WEB-INF/view/main.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>Home</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> </head> <body> 你好:<%=((com.smartcom.esp.pojo.User)request.getSession().getAttribute("loginUser")).getUsername() %>,现在时间是<%= new Date() %> </body> </html>
8. 创建Spring配置文件 /src/applicationContext.xml
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/bsdev" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 配置sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-cfg.xml" /> </bean> <!-- 配置sqlSessionTemplate --> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <!-- 配置事务 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="txManager" /> <!-- 数据映射器类 mapper bean --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.smartcom.esp.dao.mapper.IUserDao" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> <!-- 配置Service --> <bean id="userService" class="com.smartcom.esp.service.impl.UserServiceImpl"> <property name="userDao" ref="userMapper" /> </bean> <!-- 配置Manage --> <bean id="loginManage" class="com.smartcom.esp.manage.LoginManage"> <property name="userService" ref="userService" /> </bean> </beans>
9. 创建MyBatis的配置文件:/src/mybatis-cfg.xml
<?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 type="com.smartcom.esp.pojo.User" alias="User" /> </typeAliases> <!-- 定义映射资源 --> <mappers> <mapper resource="com/smartcom/esp/dao/mapper/IUserDao.xml" /> </mappers> </configuration>
10. 创建实体类:com.smartcom.esp.pojo.User.java
package com.smartcom.esp.pojo; public class User { private Integer id; private String username; private String password; private Integer age; private Integer status; private String name; public final static Integer USER_LOCK=-1; //锁定 public final static Integer USER_NORMAL=1; //正常 public final static Integer USER_NOEXISTS=0;//不存在 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User() { super(); } public User(Integer id, String username, String password, Integer age,Integer status,String name) { super(); this.id = id; this.username = username; this.password = password; this.age = age; this.status = status; this.name = name; } }
11. 创建Dao层:com.smartcom.esp.dao.mapper (勿需实现Dao层的接口)
11.1 创建Dao层接口文件:com.smartcom.esp.dao.mapper.IUserDao.java
package com.smartcom.esp.dao.mapper; import com.smartcom.esp.pojo.User; public interface IUserDao { public User findByName(String username); }
11.2 创建Dao层映射文件:com.smartcom.esp.dao.mapper.IUserDao.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文件最好放在与Dao接口同一目录下 --> <mapper namespace="com.smartcom.esp.dao.mapper.IUserDao"> <!-- 定义数据库字段与实体对象的映射关系 --> <resultMap type="com.smartcom.esp.pojo.User" id="User"> <id column="id" property="id" javaType="int" jdbcType="INTEGER" /> <result column="name" property="name" javaType="java.lang.String" jdbcType="VARCHAR" /> <result column="username" property="username" javaType="java.lang.String" jdbcType="VARCHAR" /> <result column="password" property="password" javaType="java.lang.String" jdbcType="VARCHAR" /> <result column="age" property="age" javaType="int" jdbcType="INTEGER" /> <!-- result column="birthday" property="birthday" javaType="java.util.Date" jdbcType="DATE" / --> </resultMap> <!-- 定义要操作的SQL语句 --> <insert id="save" parameterType="com.smartcom.esp.pojo.User" useGeneratedKeys="true" keyProperty="id"> insert into user(name,phone,birthday) values(#{name},#{phone},#{birthday}) </insert> <update id="update" parameterType="com.smartcom.esp.pojo.User"> update user set name=#{name},phone=#{phone},birthday=#{birthday} where id=#{id} </update> <delete id="delete" parameterType="int"> delete from user where id=#{id} </delete> <select id="findByName" parameterType="String" resultMap="User"> select * from user where username=#{username} </select> <select id="findAll" resultMap="User"> select * from user </select> </mapper>
12. 创建Service层:com.smartcom.esp.service---->该层依赖Dao层(com.smartcom.esp.dao).
12.1 创建Service层基本接口文件,所有Server中的接口都需继承该接口:com.smartcom.esp.service.IBaseService.java
package com.smartcom.esp.service; public interface IBaseService { //无任何方法 }
12.2 创建Service层接口文件:com.smartcom.esp.service.IUserService.java
package com.smartcom.esp.service; import com.smartcom.esp.pojo.User; public interface IUserService extends IBaseService{ public User checkPWD(String username); }
12.3 创建Service层实现文件:com.smartcom.esp.service.impl.UserServiceImpl.java
package com.smartcom.esp.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import com.smartcom.esp.dao.mapper.IUserDao; import com.smartcom.esp.pojo.User; import com.smartcom.esp.service.IUserService; @Transactional public class UserServiceImpl implements IUserService { @Autowired private IUserDao userDao; public IUserDao getUserDao() { return userDao; } public void setUserDao(IUserDao userDao) { this.userDao = userDao; } @Override public User checkPWD(String username) { return userDao.findByName(username); } }
13. 创建门面层:com.smartcom.esp.manage---->该层依赖Service层(com.smartcom.esp.service).
13.1 创建门面层接口文件:com.smartcom.esp.manage.IBizManage.java
package com.smartcom.esp.manage; /** * 门面层 * @author Administrator * */ public interface IBizManage<T> { //返回Service层对象 public T getService(); }
13.2 创建门面层实现文件:com.smartcom.esp.manage.LoginManage.java
package com.smartcom.esp.manage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.smartcom.esp.service.IBaseService; import com.smartcom.esp.service.IUserService; /** * 登录门面 * @author Administrator * */ @Service public class LoginManage implements IBizManage<IBaseService> { @Autowired private IUserService userService; public IUserService getUserService() { return userService; } public void setUserService(IUserService userService) { this.userService = userService; } @Override public IBaseService getService() { if(this.userService instanceof IBaseService){ return userService; }else{ return null; } } }
14. 创建Web层:com.smartcom.esp.web [放置所有Controller] ---->该层依赖门面层(com.smartcom.esp.manage).
com.smartcom.esp.web.LoginController.java
package com.smartcom.esp.web; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import com.smartcom.esp.manage.IBizManage; import com.smartcom.esp.pojo.User; import com.smartcom.esp.service.IUserService; /** * 登录 * * @author Administrator * */ @Controller @RequestMapping("/login") public class LoginController extends BaseController { private String formView ; private String succView ; @Autowired public IBizManage<IUserService> login; public IBizManage<IUserService> getLogin() { return login; } public void setLogin(IBizManage<IUserService> login) { this.login = login; } public String getSuccView() { return succView; } public void setSuccView(String succView) { this.succView = succView; } public String getFormView() { return formView; } public void setFormView(String formView) { this.formView = formView; } public LoginController() { } // 用户登录 @RequestMapping("login") public ModelAndView login(HttpServletRequest request, User user) { //由用户名取用户信息 User dbUser = login.getService().checkPWD(user.getUsername()); ModelAndView mav = new ModelAndView(); mav.setViewName("forward:login"); if (dbUser == null) { mav.addObject("errorMsg", "用户名不存在"); } else if (!dbUser.getPassword().equals(user.getPassword())) { mav.addObject("errorMsg", "用户密码不正确"); } else if (dbUser.getStatus() == User.USER_LOCK) { mav.addObject("errorMsg", "用户已经被锁定,不能登录"); } else { mav.addObject("Msg", "登录成功"); setSessionUser(request, dbUser); String toUrl = (String) request.getSession().getAttribute(LOGIN_TO_URL); // 如果当前会话中没有保存登录之前的请求URL,则直接跳转到主页 if (StringUtils.isEmpty(toUrl)) { toUrl = "esp/main"; //前台首页 //toUrl = "esptool/main"; //后台首页 } System.out.println("++============>>:"+request.getAttribute("loginUser")); mav.setViewName(getSuccView()); } return mav; } // 登录注销 @RequestMapping("/doLogout") public String logout(HttpSession session) { session.removeAttribute(USER_CONTEXT); return "forward:/login"; } }
15. 测试:http://localhost:8080/esp/login.jsp
结果: 你好:lis,现在时间是Tue Nov 27 15:02:17 CST 2012