SpringMVC+Mybatis框架配置过好几次了,现在貌似终于对这些东西有些了解,自己草草的总结一下,也是再学习的一个过程。
首先,准备jar包,这个就不在赘述了。
然后就来肉戏了,以下只是我的理解,不足之处请指出,轻喷。
web.xml是一个web程序的入口,当web程序启动时,首先找web.xml。先把web.xml所有配置先贴出来。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SpringMVC</display-name>
<!-- 项目默认页面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<!-- 上下文Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 字符集过滤器 -->
<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>
<!-- servlet控制跳转 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC/context-dispatcher.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
这两项,不用说了吧。
<span style="white-space:pre"> </span><display-name>SpringMVC</display-name>
<!-- 项目默认页面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
web.xml读到这个位置,就去找这个位置下的配置文件了,这个文件是spring容器的配置,监听器不用多说。
<!-- 配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
<!-- 上下文Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置spring的文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd">
<context:component-scan base-package="com.test" />
<bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<!--创建jdbc数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
</bean>
<!-- 创建SqlSessionFactory,同时指定数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
</bean>
<bean id="sqlTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
</beans>
很简单,配置一个扫描包,就是扫描这个包下面的所有java类,如果需要spring来动态生成这个类,就给class加一个标签,这个后面会贴出来。再配置一个自动注解。数据源不用多说,配置持久化工厂,就是告诉spring要用哪种持久化方式,这里配置的是mybatis。最底下配置一个mybatis的sqlTemplate,用来进行持久化操作。这就是spring中所有的东西。因为是基于注解的,所以不用一个一个地配置bean,是不是很简单?
我们现在看看mybatis的配置:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.test.vo.EmpVo" alias="EmpVo" />
</typeAliases>
<mappers>
<mapper resource="mybatis/mapper/empMapper.xml" />
</mappers>
</configuration>
这个是mybatis的总配置,配置对应VO类的别名,还有具体mapper文件存放的位置。我们看看empMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="EmpVo">
<select id="getEmpList" resultType="EmpVo">
select empNo,eName,job from
Emp2
</select>
<insert id="addEmp" parameterType="EmpVo">
insert into emp2 values(#{empNo},#{eName},#{job})
</insert>
<delete id="delEmpById" parameterType="EmpVo">
delete from emp2 where empNo=#{empNo}
</delete>
</mapper>
呵呵,SQL语句,这里注意id是唯一的,resultType是具体类,就是说查出来的字段应该和你的VO一一对应,当然也可以是系统类,int,string,都可以。但是这样不能满足复杂的查询,所以更多情况下我们使用resultMap,resultMap具体配置可以自行google或度娘
![奋斗](http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif)
整个spring和持久化层的东西就搞完了,我们现在继续回到web.xml。
<!-- 字符集过滤器 -->
<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>
这个是过滤器,和springMVC没什么关系,主要功能是将所有请求的编码格式改成UTF-8格式。
继续往下看:
<!-- servlet控制跳转 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC/context-dispatcher.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这是配置MVC的部分,其实无论是SpringMVC还是structs,其实都是把servlet封装了,所以这里其实就是配置servlet。将带有后缀名为.do的http请求拦截(dispatch),然后根据配置去解析相应的请求。我们看看这个文件:
<beans default-lazy-init="true"
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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 通过注解,把URL映射到Controller上,该标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven />
<!-- 使用注解的包,包括子集 -->
<context:component-scan base-package="com.samsung.controller" />
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
同样也是简单到爆啊有木有,加注解,加扫包,配置视图解析,视图解析的作用就是加前后缀,直接读文件。
整个springMVC的框架就搭好了,不到100行的Xml。当然,事务处理神马的没有加,最基本的东西已经配置好了,就可以用了。
总结一下:
web.xml是web程序入口,关于SpringMVC需要配置的有:配置Spring的文件位置,Spring监听器,MVC也就是servlet的配置;
spring文件中需要配置的有:扫包,自动注解,数据源,数据源工厂(在这里配置你的持久化方式),还有进行持久化操作的sqlTemplate;
mybatis配置的有:别名,mapper文件存放的位置,mapper文件配置具体的sql语句;
mvc的配置有:扫包,自动注解,视图解析。
下面附上代码结构和代码:
Controller
@Controller
public class TestController {
@Autowired
private ITestSVC testSVC;
@RequestMapping(value = "/list.do")
public String select(HttpServletRequest request, Model model) {
List<EmpVo> emps = testSVC.findAll();
model.addAttribute("emps", emps);
System.out.println(emps.size());
return "list";
}
@RequestMapping(value = "/toAdd.do")
public String toAdd(HttpServletRequest request, Model model) {
return "add";
}
@RequestMapping(value = "/add.do")
public String add(HttpServletRequest request, Model model) {
EmpVo empVo = new EmpVo();
empVo.setEmpNo(request.getParameter("empNo"));
empVo.seteName(request.getParameter("eName"));
empVo.setJob(request.getParameter("job"));
testSVC.add(empVo);
return "redirect:/list.do";
}
@RequestMapping(value = "/del.do")
public String delEmp(HttpServletRequest request, Model model) {
EmpVo empVo = new EmpVo();
empVo.setEmpNo(request.getParameter("empNo"));
testSVC.delete(empVo);
return "redirect:/list.do";
}
}
ITestDao
public interface ITestDao {
public void add(EmpVo emp);
public void delete(EmpVo emp);
public List<EmpVo> findAll();
public void update(EmpVo emp);
public EmpVo findOne(String id);
}
TestDaoImpl
@Repository
public class TestDao implements ITestDao {
@Autowired
private SqlSessionTemplate sqlTemplate;
@Override
public void add(EmpVo emp) {
sqlTemplate.insert("addEmp", emp);
}
@Override
public void delete(EmpVo emp) {
sqlTemplate.delete("delEmpById", emp);
}
@Override
public List<EmpVo> findAll() {
List<EmpVo> list = new ArrayList<EmpVo>();
list = sqlTemplate.selectList("getEmpList");
return list;
}
@Override
public void update(EmpVo emp) {
}
@Override
public EmpVo findOne(String id) {
return null;
}
ITestSVC
public interface ITestSVC {
public void add(EmpVo emp);
public void delete(EmpVo emp);
public List<EmpVo> findAll();
public void update(EmpVo emp);
}
@Repository
public class TestSVCImpl implements ITestSVC {
@Autowired
private ITestDao testDao;
@Override
public void add(EmpVo emp) {
testDao.add(emp);
}
@Override
public void delete(EmpVo emp) {
testDao.delete(emp);
}
@Override
public List<EmpVo> findAll() {
return testDao.findAll();
}
@Override
public void update(EmpVo emp) {
testDao.update(emp);
}
}
EmpVo
public class EmpVo {
private String empNo;
private String eName;
private String job;
public EmpVo() {
}
public EmpVo(String empNo, String eName, String job) {
super();
this.empNo = empNo;
this.eName = eName;
this.job = job;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String geteName() {
return eName;
}
public void seteName(String eName) {
this.eName = eName;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}