1.0 springMVC 的作用
springMVC 在我看来是用spring的有点来实现MVC架构 这样可以整合许多优秀的框架中的功能
例如本篇重点介绍的spring同mybatis 的整合
2.0 环境配置
- 开发工具 eclipse
- jar包 spring-web spring-webmvc spring-mybatis jackson
3.0 步骤
3.1 编写web.xml
a. 使拦截器执行springmvc的拦截器
<--
默认的拦截器在web.xml 中 配置,下面是把这个拦截功能交给spring的代码
spring 中如果你没有指定用哪个配置文件去作为spring拦截的配置文件 会自动寻找文件名为
xxxx-servlet.xml 的配置文件
-->
<servlet>
<servlet-name>springweb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<-- 下面的代码是指定默认的配置文件 否则会默认寻找名为xxxx-servlet.xml 的配置文件
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springweb.xml</param-value>
<init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springweb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
b. 在web.xml 中加载spring上下文 也就是指定spring配置文件的位置
<--
下面代码中<listener> 就是初始化的作用
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<--
初始化文件的位置 具体怎么加载的spring已经为我们写好了 我们所可以改的就是
<param-value>classpath:Resource/SpringConf.xml</param-value>
还句话说 配置此处的目的就是告诉spring要加载的配置文件的路径
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Resource/SpringConf.xml</param-value>
</context-param>
c. 在web.xml 中编写字符过滤器防止乱码
<!-- 自定义编码拦截器 也是spring为我们写好的 -->
<filter>
<filter-name>setcharacter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setcharacter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.2 接下来我们配置springMVC 的配置文件springweb.xml 也就是spring的层次的拦截
a. 首先我们要配置的是视图解析 也就是配置前缀 后缀
<--
例如我有一个a.jsp 文件 位于WEB-INF 目录下 那么这个WEB-INF 就是前缀
这个jsp 就是后缀 这样我们在servlet中只需要返回a 就可以定位到a.jsp 这个文件了
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
b. 接着我们配置json转换器 也就是前后端传数据所需要的格式,这里我们需要jackson 包
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJackson2HttpMessageConverter" /><!-- json转换器 -->
</list>
</property>
</bean>
c. 我们spring一般会采用注解的方式去拦截请求 这些注解写在我们的代码中 这时候需要在配置文件中
注册,采用注解的方式扫描
<context:component-scan base-package="com.ccut.*" />
d. 对于一些静态资源 例如css 图片等文件 我们不希望用spring的拦截 所以我们要在springweb.xml 说明
<mvc:default-servlet-handler/>
<mvc:annotation-driven />
除了在springweb.xml 中 说明 我们还要在web.xml 中设置处理的方式 这里实际使用中我注视掉了 但是仍然可以访问,我也不知道为什么,可能是我记忆有偏差
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
这句话的意思是 对于所有的后缀为js 的spring都不拦截
3.3 完整的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"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 自定义编码拦截器 -->
<filter>
<filter-name>setcharacter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setcharacter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Resource/SpringConf.xml</param-value>
</context-param>
<servlet>
<servlet-name>springweb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springweb.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springweb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.4 完整的springweb.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:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler/>
<mvc:annotation-driven />
<context:component-scan base-package="com.ccut.*" />
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJackson2HttpMessageConverter" /><!-- json转换器 -->
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
4.0 配置好上面的文件 我们就可以写servlet 了 首先我们写一个前台页面
a 页面 index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript" src="./js/jquery.js"></script>
<script type="text/javascript" src="./js/t.js"></script>
<link rel="stylesheet" href="./css/a.css">
</head>
<body>
欢迎!!!!!!!!!!<br/>
姓名:<input name="yourname" id = "name">
<button id="sua">提交</button>
<div id="divid">
这里是div
</div>
<!-- <form action="http://localhost:8080/spring_mybatis_mvc/t" method="get">
name:<input type="text" name="yourname">
<input type="submit" value="提交">
</form> -->
</body>
</html>
b 执行请求的t.js
$(document).ready(function(){
$("#sua").click(submit);
});
function submit() {
var name = $("#name").val();
$.ajax({
url : "http://localhost:8080/spring_mybatis_mvc/t",
type : "post",
data : {
"yourname":name
},
dataType:"json",
success : function(flag){
alert(flag)
}
});
}
css 文件 无关紧要 不贴了 就是测试一下静态拦截的问题
5.0 接下来是后台
mybatis-spring 是mybatis 与spring的完美整合 这里就直接顺路讲了
5.1 spring 配置文件
这个文件的主要作用就是整合spring与mybatis 同时 配置数据库数据源
这样我们就不需要写mybatis 的配置文件了 只需要写映射文件就ok了
a 文件springConfig.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:p="http://www.springframework.org/schema/p" xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.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-3.1.xsd ;
http://www.springframework.org/schema/cache ;
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 1.0自动扫描com.ccut下面的所有包 启用下面的标签就可以不用
<context:annotion-config/>
-->
<context:component-scan base-package="com.ccut.*"/>
<!-- 2.0配置datasource数据源 -->
<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/xyd"/>
<property name="username" value="root"/>
<property name="password" value="xuyandong"/>
</bean>
<!--3.0 用mybatis加载上述数据源,同时构建sqlsessionfatory 并且配置mybatis配置文件位置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="DataSource"/>
<property name="mapperLocations">
<list>
<value>classpath:com/ccut/DAO/*.xml</value>
</list>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.ccut.DAO"></property>
</bean>
</beans>
b 然后我们建立数据库模型 也就是Model 层
package com.ccut.Model;
/*
* 对应数据库中的表结构
* */
public class T {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
前台参数的封装类 Name.java
package com.ccut.Model;
public class Name {
private String yourname;
public String getYourname() {
return yourname;
}
public void setYourname(String yourname) {
this.yourname = yourname;
}
}
package com.ccut.Model;
public class Name {
private String yourname;
public String getYourname() {
return yourname;
}
public void setYourname(String yourname) {
this.yourname = yourname;
}
}
c 接下来就是操作数据库的DAO 层 userMapper.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="com.ccut.DAO.UserMapper">
<!-- 按id查询 -->
<select id="selectAll" resultType="com.ccut.Model.T">
select * from t
</select>
</mapper>
d 然后是这个映射文件对应的操作接口UserMapper.java
package com.ccut.DAO;
import com.ccut.Model.T;
public interface UserMapper {
public T selectAll();
}
e 有了数据库的模型和操作 我们接下来写业务层services
业务层引用DAO 层 注意是引用不应该包含具体的对象,所以代码如下
接口SelectFromT.java(对没错 和UserMapper .java 一样)
package com.ccut.services;
import com.ccut.Model.T;
public interface SelectFromT {
public T selectInformation();
}
f 上面接口的实现类SelectFromTimp.java(这里就是引用 引用DAO层的接口 注意DAO层的接口 不需要我们实现,你按照mybatis的标准写,mybatis 就已经帮你实现了)
package com.ccut.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import com.ccut.DAO.UserMapper;
import com.ccut.Model.T;
@Service
public class SelectFromTimp implements SelectFromT {
@Autowired
UserMapper mapper;
@Override
public T selectInformation() {
return mapper.selectAll();
}
}
g 后台逻辑写好了 我们下一步写啥呢?就是 Action 层 也就是servlet
SpringServlet.java 内容如下
package com.ccut.Action;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ccut.Model.Name;
import com.ccut.services.SelectFromT;
import com.ccut.services.SelectFromTimp;
@Controller
@RequestMapping("/t")
public class SpringServlet {
@Resource
SelectFromT fromT;
//这里的name 类是我封装好的javaBean类 为了匹配前台的参数 例如前台的参数名是username userpassword
//那么username userpassword就是name类的属性
@RequestMapping(method=RequestMethod.POST)
@ResponseBody
public boolean servetGet(Name name,HttpServletRequest req,HttpServletResponse resp) {
System.out.println("反正我执行了");
String namString = fromT.selectInformation().getName();
System.out.println(namString);
if(namString.equals(name.getYourname()))
{
System.out.println("你猜");
return true;
}
else {
return false;
}
}
@RequestMapping(method=RequestMethod.POST,value="/redirect")
public String name() {
return "hello";
}
}
全部ok
项目结构如图:
6.0 好了我们全部写完了 开始运行我们用Tomcat7
前台页面
输入1 后 后台打印
前台返回
说明前后台 交互完成