JavaWeb:(练习)十八、Spring学习练习四
JavaWeb:(练习)十八、Spring学习练习四
一、学习目标
初次接触Spring框架,学习了Spring的基础,基本了解了Spring的作用和优缺点。
搭建了第一个Spring项目,导入Spring配置文件,学习并练习了IOC控制反转,并且进行Spring Bean管理,以xml配置方式和注解方式分别实现。并且练习了Spring JDBC。由此完成了spring练习一
在练习一的基础上,学习并练习了Spring AOP、Spring事务管理等。以下是在练习一的基础上,所改变的练习代码。
在练习一、练习二的基础上,继续学习。练习了spring集成mybatis,并且测试前端发送数据到后端。
学习前后端交互,修改后一下代码如下
注:并未附上前端代码,在JavaWeb系列中包含前端文件
二、controller包
UserController
package com.ffyc.ssm.controller;
import com.ffyc.ssm.common.CommonResult;
import com.ffyc.ssm.model.User;
import com.ffyc.ssm.service.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;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
/*
@RestController包含@Controller和@ResponseBody
*/
// @Controller
@RestController
@RequestMapping(value = "/userCtl")
public class UserController {
@Autowired
UserService userService;
/*
@ResponseBody,以json字符串向前端发送数据
*/
// @ResponseBody
@RequestMapping(value = "/login")
public CommonResult<User> login(User user, HttpSession session) {
try{
System.out.println(user);
System.out.println("---------");
User u = userService.login(user);
System.out.println(u);
if (u != null) {
session.setAttribute("user", u);
return new CommonResult("登陆成功", 200, u);
} else {
return new CommonResult("账号或密码错误", 202, null);
}
} catch (Exception e) {
return new CommonResult("系统错误", 500, null);
}
}
@RequestMapping(value = "/logOut")
public CommonResult<User> logOut(User user, HttpSession session) {
return new CommonResult("退出成功", 200, null);
}
}
三、dao包
UserDao
package com.ffyc.ssm.dao;
import com.ffyc.ssm.model.User;
import org.springframework.stereotype.Repository;
public interface UserDao {
User login(User user);
}
四、model包
User
package com.ffyc.ssm.model;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Repository;
import java.util.Date;
@Repository(value = "user")
public class User {
private Integer userId;
private String userAccount;
private String userPassword;
/*@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date userTime;*/
public User() {
}
public User(Integer userId, String userAccount, String userPassword) {
this.userId = userId;
this.userAccount = userAccount;
this.userPassword = userPassword;
}
/*public User(Integer userId, String userAccount, String userPassword, Date userTime) {
this.userId = userId;
this.userAccount = userAccount;
this.userPassword = userPassword;
this.userTime = userTime;
}*/
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserAccount() {
return userAccount;
}
public void setUserAccount(String userAccount) {
this.userAccount = userAccount;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
/*public Date getUserTime() {
return userTime;
}
public void setUserTime(Date userTime) {
this.userTime = userTime;
}*/
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userAccount='" + userAccount + '\'' +
", userPassword='" + userPassword + '\'' +
'}';
}
/*@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userAccount='" + userAccount + '\'' +
", userPassword='" + userPassword + '\'' +
", userTime=" + userTime +
'}';
}*/
}
五、service包
UserService
package com.ffyc.ssm.service;
import com.ffyc.ssm.dao.UserDao;
import com.ffyc.ssm.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service(value = "userService")
@Transactional
public class UserService {
@Autowired
UserDao userDao;
/*
获得sqlSession,创建代理对象
关闭sqlSession,提交事务
统统都被spring管理了
*/
public User login(User user) {
return userDao.login(user);
}
}
六、filter包
package com.ffyc.ssm.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CorsFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
//允许携带Cookie时不能设置为* 否则前端报错
httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
filterChain.doFilter(servletRequest, servletResponse);
}
}
七、common包
package com.ffyc.ssm.common;
public class CommonResult<T> {
// 消息
String message;
// 状态码
int code;
// 数据
T data;
public CommonResult() {
}
public CommonResult(String message, int code, T data) {
this.message = message;
this.code = code;
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
八、配置文件
1、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<name>ssm</name>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.6.2</junit.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring 结合 mybatis 的插件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- spring-mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
</project>
2、config.properties
dirverClassName=com.mysql.cj.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/ffycdb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
uname = root
password = root
3、db.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:property-placeholder location="classpath:config.properties"></context:property-placeholder>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${url}"></property>
<property name="driverClassName" value="${dirverClassName}"></property>
<property name="username" value="${uname}"></property>
<property name="password" value="${password}"></property>
<property name="initialSize" value="5"></property>
<property name="maxActive" value="20"></property>
<property name="maxWait" value="100"></property>
</bean>
<!-- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!– 注入数据源 –>
<property name="dataSource" ref="dataSource"></property>
</bean>-->
<!-- 配置 spring 事务管理类, 并注入数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
4、mybatis.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>
<settings>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.ffyc.ssm.model.User" alias="User"></typeAlias>
</typeAliases>
</configuration>
5、spring.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.ffyc.ssm"></context:component-scan>
<!-- 导入另一个配置文件 -->
<import resource="classpath:spring_mybatis.xml"></import>
<import resource="classpath:springmvc.xml"></import>
<!-- 基于注解方式 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
6、spring_mybatis.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 导入另一个配置文件 -->
<import resource="classpath:db.xml"></import>
<!-- 配置 sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
<property name="mapperLocations" value="classpath:Mapper/*Mapper.xml"></property>
</bean>
<!-- 指定生成接口代理 -->
<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ffyc.ssm.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
7、springmvc.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启 springmvc 注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 所有请求进入拦截器 -->
<mvc:exclude-mapping path="/userCtl/login"/> <!-- 哪些请求不进入拦截器 -->
<bean id="isLogin" class="com.ffyc.ssm.filter.IsLoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
8、UserMapper
<?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.ffyc.ssm.dao.UserDao">
<select id="login" resultType="User">
select * from user
where user_account = #{userAccount} and user_password = #{userPassword}
</select>
</mapper>