这是我的第一个博客随笔,加油每一天,下面开始代码分享吧
步骤一,准备工作,环境搭建,创建基础包
1.开发环境以及数据库环境
idea mysql 5.7.19 tomcat 9 maven 3.6
CREATE DATABASE `ssmbuild`;
USE `ssmbuild`; DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COMMENT '书名',
`bookCounts` INT(11) NOT NULL COMMENT '数量',
`detail` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID` (`bookID`) )
ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)
VALUES (1,'Java',1,'从入门到放弃'), (2,'MySQL',10,'从删库到跑路'), (3,'Linux',5,'从进门到进牢');
2.导入maven依赖
1 <dependency> 2 <groupId>junit</groupId> 3 <artifactId>junit</artifactId> 4 <version>4.11</version> 5 </dependency> 6 <dependency> 7 <groupId>org.springframework</groupId> 8 <artifactId>spring-jdbc</artifactId> 9 <version>5.2.7.RELEASE</version> 10 </dependency> 11 <dependency> 12 <groupId>mysql</groupId> 13 <artifactId>mysql-connector-java</artifactId> 14 <version>5.1.47</version> 15 </dependency> 16 <dependency> 17 <groupId>org.springframework</groupId> 18 <artifactId>spring-webmvc</artifactId> 19 <version>5.2.7.RELEASE</version> 20 </dependency> 21 <dependency> 22 <groupId>javax.servlet</groupId> 23 <artifactId>servlet-api</artifactId> 24 <version>2.5</version> 25 </dependency> 26 <dependency> 27 <groupId>org.mybatis</groupId> 28 <artifactId>mybatis</artifactId> 29 <version>3.5.5</version> 30 </dependency> 31 <dependency> 32 <groupId>org.mybatis</groupId> 33 <artifactId>mybatis-spring</artifactId> 34 <version>2.0.2</version> 35 </dependency> 36 37 <dependency> 38 <groupId>javax.servlet.jsp</groupId> 39 <artifactId>jsp-api</artifactId> 40 <version>2.2</version> 41 </dependency> 42 <!-- 数据库连接池 --> 43 <dependency> 44 <groupId>com.mchange</groupId> 45 <artifactId>c3p0</artifactId> 46 <version>0.9.5.2</version> 47 </dependency> 48 <dependency> 49 <groupId>javax.servlet</groupId> 50 <artifactId>jstl</artifactId> 51 <version>1.2</version> 52 </dependency> 53 <dependency> 54 <groupId>org.projectlombok</groupId> 55 <artifactId>lombok</artifactId> 56 <version>1.18.12</version> 57 </dependency> 58 <dependency> 59 <groupId>com.alibaba</groupId> 60 <artifactId>fastjson</artifactId> 61 <version>1.2.60</version> 62 </dependency>
3.maven资源过滤,支持外部文件引入
1 <build> 2 <resources> 3 <resource> 4 <directory>src/main/java</directory> 5 <includes> 6 <include>**/*.properties</include> 7 <include>**/*.xml</include> 8 </includes> 9 <filtering>false</filtering> 10 </resource> 11 <resource> 12 <directory>src/main/resources</directory> 13 <includes> 14 <include>**/*.properties</include> 15 <include>**/*.xml</include> 16 </includes> 17 <filtering>false</filtering> 18 </resource> 19 </resources> 20 </build>
4.建立基本结构和配置头文件
- com.bdqn.controller
- com.bdqn.pojo
- com.bdqn.service
- com.bdqn.dao
- mybatis-config.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <configuration> 5 6 </configuration>
- applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-"> 6 7 </beans>
步骤二,编写mybaits层类以及配置文件
1.数据库配置文件数据源 database.properties
1c3p0.username="root"
2c3p0.password="513029"
3c3p0.url="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=utf-8"
4c3p0.driver="com.mysql.jdbc.Driver"
2.idea关联数据库
3.编写mybatis-confil核心配置文件(一般只用取别名和设置还有映射mapper)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <typeAliases> 7 <package name="com.bdqn.Pojo"/> 8 </typeAliases> 9 <mappers> 10 <mapper class="com.bdqn.Mapper.UserMapper"/> 11 </mappers> 12 </configuration>
4.编写对应数据库数据的实体类
5.编写操作实体类数据的dao层mapper接口
@Component
public interface UserMapper {
//增加一个用户
int addUser(User user);
//删除一个用户
int deleteUserById(int id);
//更改一个用户
int updateUser(User user);
//根据id查询用户
User findUserById(int id);
//查询所有用户
List<User> findUserAll();
//根据姓名模糊查询
List<User> findUserByName(String username);
}
6.编写接口对应的mapper.xml文件(需要导入myabits包)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.bdqn.Mapper.UserMapper"> 6 <insert id="addUser" parameterType="user" > 7 insert into user(username, birthday, sex, address) 8 values(#{username},#{birthday},#{sex},#{address}) 9 </insert> 10 11 <delete id="deleteUserById" parameterType="int"> 12 delete from user where id=#{id} 13 </delete> 14 <update id="updateUser" parameterType="user"> 15 update user set 16 username=#{username}, 17 sex=#{sex}, 18 address=#{address} 19 where id=#{id} 20 </update> 21 22 <select id="findUserById" resultType="user" parameterType="int"> 23 select *from user where id=#{id} 24 </select> 25 <select id="findUserAll" resultType="user"> 26 select *from user 27 </select> 28 <select id="findUserByName" resultType="user" parameterType="string"> 29 select *from user where username like #{username} 30 </select> 31 </mapper>
7.编写service接口和实现类(实现业务层调用数据访问层)
1 public interface UserService { 2 //增加一个用户 3 int addUser(User user); 4 //删除一个用户 5 int deleteUserById(int id); 6 //更改一个用户 7 int updateUser(User user); 8 //根据id查询用户 9 User findUserById(int id); 10 //查询所有用户 11 List<User> findUserAll(); 12 //根据姓名模糊查询 13 List<User> findUserByName(String username); 14 }
8.注意:想要业务层调用dao层方法,此业务实现类中需要注册一个dao层接口的属性,给spring容器进行管理,此处使用注解实现
1 @Service("userServiceimpl") //注册业务实现类进入spring容器 2 public class UserServiceimpl implements UserService { 3 //将dao层接口 设置一个set 进行注入到spring中,统一管理 4 @Autowired 5 @Qualifier("userMapper") 6 private UserMapper userMapper; 7 public void setUserMapper(UserMapper userMapper) { 8 this.userMapper = userMapper; 9 } 10 11 public int addUser(User user) { 12 return userMapper.addUser(user); 13 } 14 15 public int deleteUserById(int id) { 16 return userMapper.deleteUserById(id); 17 } 18 19 public int updateUser(User user) { 20 return userMapper.updateUser(user); 21 } 22 23 public User findUserById(int id) { 24 return userMapper.findUserById(id); 25 } 26 27 public List<User> findUserAll() { 28 return userMapper.findUserAll(); 29 } 30 31 public List<User> findUserByName(String username) { 32 return userMapper.findUserByName(username); 33 } 34 }
到此,底层myabtis需求配置完毕
步骤二,编写spring整合mybaits相关配置文件(配置dao层和service层文件)
dao层配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring- 7 http://www.springframework.org/schema/context 8 https://www.springframework.org/schema/context/spring-context.xsd"> 9 10 <!--1.扫描包,支持注解--> 11 <context:component-scan base-package="com.bdqn.Dao"/> 12 <!--引用外部配置数据源的文件--> 13 <context:property-placeholder location="database.properties"/> 14 <!--配置数据库连接池属性--> 15 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 16 <property name="driverClass" value=""/> 17 <property name="jdbcUrl" value=""/> 18 <property name="user" value=""/> 19 <property name="password" value=""/> 20 </bean> 21 <!--创建工厂函数--> 22 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 23 <property name="dataSource" ref="dataSource"/> 24 <!--配置mybaits全局文件(相当于引用融合)--> 25 <property name="configLocation" value="mybatis-conflg.xml"/> 26 </bean> 27 <!--扫描dao接口包,给该包下的接口造一个子类代理对象 动态实现接口注入到spring容器中,--> 28 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 29 <property name="basePackage" value="com.bdqn.Dao"/> 30 </bean> 31 32 33 34 </beans>
当然,还可以进行对应的功能增加,例如
1 <!--全局异常处理器--> 2 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 3 <property name="exceptionMappings"> 4 <props> 5 <!--key值为 报出的异常类型,error为返回到指定的视图名,可配置多个--> 6 <prop key="java.lang.ClassCastException">error</prop> 7 </props> 8 </property> 9 </bean>
service配置文件(主要配置aop切入增强各类中方法,异常增强,环绕增强等)
注:事物增加也算是一种增强,最大的优点就是可以保证事物一致性,防止出现脏数据等数据库错误
1 <!--可以使用aop增加业务--> 2 <context:component-scan base-package="com.bdqn.Service"/> 3 4 <!--将service实现类注入进spring,可用注解实现--> 5 <!--<bean id="userServiceimpl" class="com.bdqn.Service.impl.UserServiceimpl">--> 6 <!--<property name="userMapper" ref="userMapper"/>--> 7 <!--</bean>--> 8 9 <!--定义事物管理器,配置声明事物,开启事物--> 10 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 11 <property name="dataSource" ref="dataSource"/> 12 </bean> 13 <!--结合aop实现事物的植入--> 14 <!--配置事物通知--> 15 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 16 <!--给那些操作数据库的方法配置事物--> 17 <!--propagation表示事物的传播特性 redeonly表示只读--> 18 <tx:attributes> 19 <tx:method name="*" propagation="MANDATORY"/> 20 <!--<tx:method name="select*" read-only="true"/>--> 21 </tx:attributes> 22 </tx:advice> 23 <!--配置事物切入点,增强事物 保证事物一致性--> 24 <aop:config> 25 <aop:pointcut id="txPointCut" expression="execution(* com.bdqn.Service.*.*(..))"/> 26 <!--给指定包中的所有方法添加上面定义的事物增强--> 27 <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> 28 </aop:config>
到此,spring层的配置文件编写搞定,注意一点就是:spring就是一个容器,一个大杂烩,统一管理多种
第四步,编写前端视图展示以及web配置文件和综合spring
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 <!--中央配置器--> 7 <servlet> 8 <servlet-name>springmvc</servlet-name> 9 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 10 <init-param> 11 <param-name>contextConfigLocation</param-name> 12 <param-value>classpath:applicationContext.xml</param-value> 13 </init-param> 14 </servlet> 15 <servlet-mapping> 16 <servlet-name>springmvc</servlet-name> 17 <url-pattern>/</url-pattern> 18 </servlet-mapping> 19 <!--乱码过滤--> 20 <filter> 21 <filter-name>ecoding</filter-name> 22 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 23 <init-param> 24 <param-name>encoding</param-name> 25 <param-value>utf-8</param-value> 26 </init-param> 27 </filter> 28 <filter-mapping> 29 <filter-name>ecoding</filter-name> 30 <url-pattern>/*</url-pattern> 31 </filter-mapping> 32 <!--session消失时间--> 33 <session-config> 34 <session-timeout>15</session-timeout> 35 </session-config> 36 </web-app>
servlet.xml核心四个配置
1 <!--1.扫描包,支持注解--> 2 <context:component-scan base-package="com.bdqn.Controller"/> 3 <!--静态资源过滤--> 4 <mvc:default-servlet-handler/> 5 <!--适配器,映射器,消息转换器--> 6 <mvc:annotation-driven> 7 8 </mvc:annotation-driven> 9 <!--视图解析器--> 10 <bean id="resolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 11 <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> 12 <property name="suffix" value=".jsp"/> 13 </bean>
另外是一些外加的功能需求配置
文件上传
1 <!--文件上传配置--> 2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 3 <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容, 默认为ISO-8859-1 --> 4 <property name="defaultEncoding" value="utf-8"/> 5 <!-- 上传文件大小上限,单位为字节(10485760=10M) --> 6 <property name="maxUploadSize" value="10485760"/> 7 <property name="maxInMemorySize" value="40960"/> 8 </bean>
拦截器:好处与作用详情请看拦截器博客
1 <mvc:interceptors> 2 <mvc:interceptor> 3 <!--/** 包括路径及其子路径--> 4 <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--> 5 <!--/admin/** 拦截的是/admin/下的所有--> 6 <mvc:mapping path="/**"/> 7 <!--bean配置的就是拦截器项目路径--> 8 <bean class="com.bdqn.util.MyInterceptor"/> 9 </mvc:interceptor> 10 </mvc:interceptors>
解决json格式乱码
1 <!--<!–解决json乱码–>--> 2 <mvc:annotation-driven> 3 <!--消息转换器,用于指定服务器到客户端的返回类型,以及字符编码等--> 4 <mvc:message-converters register-defaults="true"> 5 <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 6 <constructor-arg value="UTF-8"/> 7 </bean> 8 <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 9 <property name="objectMapper"> 10 <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> 11 <property name="failOnEmptyBeans" value="false"/> 12 </bean> 13 </property> 14 </bean> 15 </mvc:message-converters> 16 </mvc:annotation-driven>
整合ssm配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-"> 6 7 <import resource="spring-dao.xml"/> 8 <import resource="spring-service.xml"/> 9 <import resource="spring-web.xml"/> 10 </beans>
到此,整个ssm配置到此结束,下面就是一些view视图层的代码
编写controller类
1 @Controller 2 @RequestMapping("/user") 3 public class UserController { 4 5 6 @Autowired 7 @Qualifier("userService") 8 private UserService userService; 9 10 public void setUserService(UserService userService) { 11 this.userService = userService; 12 } 13 // @ModelAttribute //表示比所有请求先被中央控制器调用执行,多用于初始化参数 14 // public void t1(){ 15 // 16 // } 17 //// public void t2(@ModelAttribute("")表示引用前面定义的初始化参数,或者与requetparme一样获取指定的参数值) 18 19 20 @RequestMapping("toLogin") 21 public String toLogin(){ 22 return "Login"; 23 } 24 @RequestMapping("Login") 25 public String Login(User user, HttpServletRequest request,@RequestParam("file") CommonsMultipartFile file){ 26 //进行得到返回的行数 27 int num=userService.getUser(user); 28 if (num!=0){ 29 //如果成功登录,则保存session中 30 request.getSession().setAttribute("isLogin",user); 31 } 32 return "list"; 33 } 34 35 36 }
编写拦截器,实现类(保证除了登录以外的请求全部拦截,验证用户是否已登录)
1 public class MyInterceptor implements HandlerInterceptor { 2 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 3 System.out.println("----------处理请求前,进行拦截判断---------"); 4 //判断是为登录页面,就放行,以防强制访问,或者没登录就访问 5 if (request.getRequestURI().contains("Login")){ 6 System.out.println("拦截失败"); 7 return true; 8 } 9 10 //如果检测到用户已登录,那么就直接放行,不进行截断 11 if (request.getSession().getAttribute("isLogin")!=null){ 12 System.out.println("拦截失败"); 13 return true; 14 } 15 System.out.println("成功进行拦截"); 16 //反之如果没有登录,强制地址栏越级访问,则跳转到登录页面 17 request.getRequestDispatcher("toLogin").forward(request,response); 18 return false; 19 } 20 }
最后进行测试