SSM
至少需要的外部jar包
IDEA中pom.xml的依赖:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>4.3.9.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>jackson-annotations</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.7</version>
<scope>compile</scope>
</dependency>
</dependencies>
Spring整合Spring MVC:
web.xml:
<servlet>
<servlet-name>smart</servlet-name>
<!-- 配置Spring MVC前端控制器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--指定Spring和Spring MVC共用的配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- 启动服务器时,创建该servlet-->
</servlet>
<servlet-mapping>
<servlet-name>smart</servlet-name>
<!--<url-pattern>*.do</url-pattern>-->
<url-pattern>/</url-pattern>
</servlet-mapping>
url-pattern为"/“将所有请求拦截到SpringMVC处理,”/"也会拦截静态文件,需要进行配置:
将静态文件放在webapp/static文件夹中
<!-- 确保静态资源可以被访问 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>static/*</url-pattern>
</servlet-mapping>
也可以用Spring自带的<mvc:resources>
标签:
<mvc:annotation-driven/>
<mvc:resources mapping="/static/**/" location="/static/"/>
<!--或者-->
<!--
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
-->
*.do拦截后缀为do的请求,类似/user/login.do的请求也能被拦截
配置错误页面:
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
创建Spring和SpringMVC配置文件
内容为:
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd ">
<!-- 开启控制类注解扫描 -->
<context:component-scan base-package="com.test.controller">
</context:component-scan>
<!-- 开启代理模式,打开Spring对AOP的扫描 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射
-->
<mvc:annotation-driven/>
<!-- 配置视图解析器对象-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- /page/意为页面的路径,.jsp为页面格式-->
<property name="prefix" value="/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
prefix和suffix分别为控制类返回自动加上的前缀和后缀
整合mybatis
Spring整合mybatis需要mybatis-pring,所以需要加入以下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
经过实测Spring4.3.9用1.3.0的版本不会有冲突
整合后在Spring中配置mybatis,mybatis不单独建配置文件
web.xml指定配置文件:
<!-- 加载spring,mybatis配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
创建spring-mybatis.xml配置文件:
spring-mybatis.xml内容:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!--扫描dao里面的注解-->
<context:component-scan base-package="com.test.dao"/>
<!-- 数据库连接池配置文件Dao层 -->
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 数据库连接池,使用dbcp -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="10"/>
<property name="maxIdle" value="5"/>
</bean>
<!-- SqlSessionFactory配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的映射文件 -->
<property name="mapperLocations" value="classpath:Mappers/*.xml" />
</bean>
<!-- mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描dao层包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
<property name="basePackage" value="com.test.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
这里DataSource用了com.alibaba.druid.pool.DruidDataSource,连接数据库,druid依赖Spring-jdbc,所以需要加上依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.9.RELEASE</version>
<scope>compile</scope>
</dependency>
上面加载了db.properties文件,所以要创建db.properties:
内容:
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/travel?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=188278
@Controller
使用这些注解之前记得开启注解扫描
标识一个类为SpringMVC的控制层对象.使用后框架将检测该方法是否使用了@RequestMapping注解。
Spring将生成对象,默认对象名为类名首字母小写
@RequestMapping
可以用在类定义处和方法定义处。 类定义处:规定初步的请求映射,相对于web应用的根目录; 方法定义处:进一步细分请求映射,相对于类定义处的URL。
@PostMapping,DeleteMapping,PutMapping用法和@RequestMapping用法差不多.
import com.test.bo.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/user")
public class LoginController {
public UserService getUserService() {
return userService;
}
@Autowired
private UserService userService;
@RequestMapping("/loginRequest")
public String login(@RequestParam(value = "name")String name,@RequestParam("pwd")String pwd ){
if(userService.checkPwd(name,pwd)) {
return "index";
}
else
return "login";
}
}
@PathVariable
可以接受请求路径中占位符中的值
@RequestMapping("get/{userId}")
public User getById(@PathVariable("userId") long userId){
//...
}
获取前端数据
获取参数
控制类方法的参数名和input标签的name属性值相同则可以直接获取.
也可以用@RequestParam
将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
用于获取前端页面的参数,值设置成页面中input标签的name属性值
<input type="text" name="name"/>
<input type="password" name="pwd"/>
@RequestParam
@RequestParam int page
//或
@RequestParam("page")
//defaultValue设置默认值
@RequestParam(value = "page", defaultValue = "1")
获取前端数据封装对象
input的name属性值与对象的属性值相同.
<form action="${pageContext.request.contextPath}/getData.do">
<input type="text" name="userName"/><br/>
<input type="text" name="userPassword"/><br/>
<input type="text" name="phone"/><br/>
<input type="submit"/>
</form>
控制层获取对象,以对象为参数:
@RequestMapping("/getData")
public void test2(User user){
System.out.println(user.getUserName());
System.out.println(user.getUserPassword());
System.out.println(user.getPhone());
}
@RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
@Service
@Service(“serviceName”)注解相当于applicationContext.xml配置文件中配置的<bean id=“serviceName”>,表示给当前类命名一个别名,方便注入到其他需要用到的类中。@Service注解也可以不指定serviceName,默认别名就是当前类名,但是首字母小写。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public boolean checkPwd(String uname,String upwd){
System.out.println(userDao.findById(1).getName());
System.out.println(userDao.findByName("aa"));
User user=userDao.findById(1);
if (uname.equals(user.getName())&&upwd.equals(user.getPassword())){
return true;
} else {
return false;
}
}
}
@Autowired
private UserService userService;
@Repository
标识为dao层,Spring将生成对象,默认对象名为类名首字母小写
@Repository
public interface UserDao {
public User findById(int id);
@Select("select * from tab_user where name=#{name}")
public List<User> findByName(String name);
}
@Mapper
作用和@Repository类似
区别在于:
1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
@ResponseBody
将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
@RestController
控制类中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用
@RestController注解相当于@ResponseBody + @Controller合在一起的作用
Spring MVC设置session
引入依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
加上HttpSession session参数
Spring MVC拦截器
类似servlet的过滤器,用于拦截一些请求
实现HandlerInterceptor接口:
public class CustomInterceptor implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throws Exception {
return false;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler,
Exception ex) throws Exception {
}
}
-
preHandle() 方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。 -
postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。
-
afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
拦截器配置:
<!--配置拦截器-->
<mvc:interceptors>
<!--<bean class="com.ma.interceptor.CustomeInterceptor" />-->
<!--拦截器1-->
<mvc:interceptor>
<!--配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path=""/>
<!--定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截-->
<bean class="com.ma.interceptor.Intercptor1"/>
</mvc:interceptor>
<!--拦截器2-->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.ma.interceptor.Interceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
上面的代码中,<mvc:interceptors>
元素用于配置一组拦截器,基子元素<bean>
中定义的是全局拦截器,它会拦截所有的请求;而<mvc:interceptor>
元素中定义的是指定路径的拦截器,它会对指定路径下的请求生效。<mvc:interceptor>
元素的子元素<mvc:mapping>
用于配置拦截器作用的路径,该路径在其属性path 中定义。如上述代码中 path 的属性值“/**” 表示拦截所有路径,“/hello” 表示拦截所有以 “/hello” 结尾的路径。如果在请求路径中包含不需要拦截的内容,还可以通过<mvc:exclude-mapping>
元素进行配置。
注意:<mvc:interceptor>
中的子元素必须按照上述代码中的配置顺序进行编写,即<mvc:mapping> <mvc:exclude-mapping> <bean>
,否则文件会报错。
Spring MVC文件上传
pom.xml引入依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
sping-mvc.xml配置bean:
<!--文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="20971520"></property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
前端页面设置form的enctype属性:
<form action="uploadtest" enctype="multipart/form-data">
<input type="file" name="file"/>
</form>
控制层参数加MultipartFile参数:
@RequestMapping("/uploadtest")
public String upload(@RequestParam("file") MultipartFile file){
file.transferTo(File file);//保存到指定目录
}