首先,我们需要配置在resourse文件下编写applicationContext.xml文件和mysql.properties,与spring+myBatista类似
<?xml version="1.0" encoding="UTF-8"?>
<!--spring bean容器的主配置文件-->
<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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<!--定义组件扫描的基础包名
用于扫描指定基础包下的所有类里面包含的组件注解--> <!--ssm主要的组件有三大类:1.dao下数据库访问的映射接口 2:service下的业务类 3:控制器组件-->
<context:component-scan base-package="com.**.dao,com.**.service,com.**.aop"/><!--项目一加载时,包下的所有注解都会加载进来:带了组件的注解,就会把它实例化成bean容器里面的bean-->
<!--指定注解方式加载配置-->
<context:annotation-config/>
<!--定义属性文件的读取-->
<util:properties id="reader" location="classpath:mysql.properties"/>
<!--定义C3P0 连接池数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="#{reader[driver]}"/>
<property name="jdbcUrl" value="#{reader[url]}"/>
<property name="user" value="#{reader[username]}"/>
<property name="password" value="#{reader[password]}"/>
<property name="initialPoolSize" value="5"/>
<property name="maxPoolSize" value="10"/>
</bean>
<!--指定mybatis映射接口包名-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.**.dao"/><!--去扫描(映射)mapper接口的时候,让它直接去扫dao包找映射器的接口-->
</bean>
<!--定义SqlSessionFactory bean-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--定义事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务注解驱动-->
<tx:annotation-driven/>
<!--aop注解驱动-->
<aop:aspectj-autoproxy/>
</beans>
#mysql
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test0312?serverTimezone=UTC&useSSL=true
username=root
password=root
接着,再在resourse文件下配置springMVC.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--springmvc的主配置文件-->
<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"
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.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
">
<!--扫描加载控制器组件--> //前端控制器被扫描的时候才会被加载,即发送第一次请求时。所以一般不要写在applicationContext.xml中,因为两者的加载时期不同
<context:component-scan base-package="com.**.controller"/>
<!--配置注解驱动方式-->
<mvc:annotation-driven/>
<!--静态资源访问的处理方式--> <!--静态资源(图片,html)也会经过前端控制器,可是它找不到对应的映射,因为控制器里面有没有静态资源相应的映射,所以就陪配置静态资源的访问方式,一共有两种方式-->
<!--配置使用web容器默认的servlet处理静态资源访问-->
<mvc:default-servlet-handler/>
<!--配置静态资源映射路径-->
<!--<mvc:resources mapping="/resources/*" location="/,/WEB-INF"/>-->
<!--src="js/test.js"实际路径-->
<!--src="/resources/js/test.js"映射路径-->
<!--配置视图解析器--> // 控制器只需要返回视图的名字,视图的名字交还给前端控制器,前端控制器按照你配置的前缀和后缀就把,视图名(xx),放在前缀(/)和后缀(.jsp)的中间
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="/"/> //前缀
<property name="suffix" value=".jsp"/> //后缀
</bean>
</beans>
然后再在webapp/WEB-INF/web.xml中添加如下信息(当然,这要根据实际情况而定)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 重新部署工程时 Tomcat 内存溢出 -->
<listener>
<listener-class>se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventorListener</listener-class>
</listener>
<!-- 防止内存泄露 -->
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
<!--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>
<!-- 配置字符集编码转换的过滤器 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--springmvc前端控制器,核心控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这样,一个ssm的框架就搭建完成 :)
关于spring 和 mybatis 框架所对应的 dao层和service层中的程序例子在文章《spring+mybatis 配置整合》已经提到,所以文本只提供了springMVC框架所对应的controller层例子:
package com.yy.controller;
//导入包省略
@Controller
public class HelloController {
//springmvc控制器被称为完全基于方法的控制器,他可以在类里面直接写一个方法,来映射控制器的请求
//相当于定义servlet的url(请求映射的url)。当你请求根目录下的/hello,就会自动执行hello方法
@RequestMapping("/hello") //hello方法本身就可以当做一个控制器
public String hello(){
System.out.println("hello方法被执行");
//返回的是视图名,把视图名配置到springmvc.xml的视图解析器中去----所以直白讲,当请求访问/hello时,将执行hello方法,hello方法将返归一个”hello“(视图名)给视图解析器,然后调转到/hello.jsp(默认跳转方式内部转发)此方法没有带任何请求参数,返回也没有模型数据
return "hello";
}
//自动按方法参数名字和请求参数名自动映射,但这个方法参数,没有给我们当做一个模型数据被封装到作用域对象中去,因为是基本类型参数
@RequestMapping("/login")
public String login(String username,String pwd){ //基本类型数据和模型数据是有区别的
//请求参数按名称自动注入到方法参数
System.out.println(username+":"+pwd);
return "index";
}
@RequestMapping("/login1")
//将参数直接封装成一个pojo对象(一旦方法参数给的是模型数据,这个方法参数就会被放到ModelAndView中去,并放到请求作用域中去),把pojo封装成ModelAndVIew
public String login1(User user){
//请求参数按名称自动注入到方法参数 //表单的name属性一定要跟pojo的属性名相同(其实就是在反射getter,setter)
System.out.println(user.getUsername()+":"+user.getPwd());
//重定向到index.jsp
return "redirect:/index.jsp"; //你如果想绕过视图解析器(默认内部转发),则
} //设置成重定向redirect,前面配置的前缀和后缀就没用了
}
下面是前端页面代码login.jsp和index.jsp
//login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form method="post" action="login">
<p>用户名:<input name="username"></p>
<p>密码:<input type="password" name="pwd"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
//index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<h2>用户名${param.username}</h2> //username没有放在作用域里面。因为是内部转发,所以可以根据请求参数的隐式对象来获取
<h2>用户名${user.username}</h2> //取模型数据user的用户名
</body>
</html>