SSM 整合改造 SMBMS
环境要求:
- IDEA 2020.2
- MySQL 5.7.19
- Tomcat 9.0
- Maven 3.6
技术要求:
- 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;
整合思路?
- Spring MVC+Spring+ Mybatis框架,核心框架是 Spring,通过 spring ioc\di和aop
- 管理 mybatis对象、 spring mvc对象;
- 管理 controller依赖于service; service依赖于dao;dao依赖于 mybatis。
整合步骤如下,MySQL及素材文件建议参考前文:Servlet版。
1.搭建框架,导入配置文件
Section titled “1.搭建框架,导入配置文件”- 新建一个maven项目,添加web的支持。

- 导入项目中需要的jar包——在==pom.xml==中,以maven方式导入;
<?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>org.example</groupId> <artifactId>smbms</artifactId> <version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <!--servlet-api导入高版本的--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>203.0.113.10</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> </dependencies>
<!--防止IDEA默认1.5的JDK--> <properties> <maven.compiler.source>1.9</maven.compiler.source> <maven.compiler.target>1.9</maven.compiler.target> </properties>
<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 --> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
</project>- 导入相关前端素材;
- 链接:https://pan.baidu.com/s/1d0UT_pMhft7HOk5T1hvLFw
- 提取码:fqhd
2.Mybatis层
Section titled “2.Mybatis层”-
创建项目包结构
pojo/entity——实体类;dao/mapper——具体数据库操作层(增删改查);service——业务层;test/view——表示层 / 测试层;utils——工具类;filter——过滤层,放置过滤器;servlet/controller——控制层,调用业务层代码;
- 添加配置文件

- 数据库配置文件——database.properties
jdbc.driver=com.mysql.jdbc.Driver# 如果使用的是MySQL8.0+,增加一个时区的配置。jdbc.url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf8jdbc.username=rootjdbc.password=root- 编写MyBatis的核心配置文件——mybatis-config.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>
<mappers> <mapper class="com.github.mapper.ProviderMapper"/> <mapper class="com.github.mapper.BillMapper"/> <mapper class="com.github.mapper.RoleMapper"/> <mapper class="com.github.mapper.UserMapper"/> </mappers></configuration>- 编写数据库对应的实体类 com.github.pojo.User,使用lombok插件!
package com.github.pojo;
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
import java.util.Date;
@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private long id; // 主键ID private String userCode; // 用户编码 private String userName; // 用户名称 private String userPassword; // 用户密码 private int gender; // 性别 private Date birthday; // 出生日期 private String phone; // 手机 private String address; // 地址 private long userRole; // 用户角色 private long createdBy; // 创建者 private Date creationDate; // 创建时间 private long modifyBy; // 更新者 private Date modifyDate; // 更新时间
private int age; //年龄 private String userRoleName; //用户角色名称
public int getAge() { Date date = new Date(); int age = date.getYear()-birthday.getYear(); return age; }
public String getUserRoleName(){ if (userRole==1){ return "系统管理员"; }else if (userRole==2){ return "经理"; }else if (userRole==3){ return "普通员工"; } return ""; }}package com.github.pojo;
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
import java.sql.Date;
@Data@NoArgsConstructor@AllArgsConstructorpublic class Role { // ID private long id; // 角色编码 private String roleCode; // 角色名称 private String roleName; // 创建者 private long createdBy; // 创建时间 private Date creationDate; // 更新者 private long modifyBy; // 更新时间 private Date modifyDate;}package com.github.pojo;
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
import java.sql.Date;
@Data@AllArgsConstructor@NoArgsConstructorpublic class Provider { private long id; // 供应商编码 private String proCode; // 供应商名称 private String proName; // 供应商描述 private String proDesc; // 供应商联系人 private String proContact; // 供应商电话 private String proPhone; // 供应商地址 private String proAddress; // 供应商传真 private String proFax; // 创建者 private long createdBy; // 创建时间 private Date creationDate; // 更新时间 private Date modifyDate; // 更新者 private long modifyBy;}package com.github.pojo;
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;
import java.math.BigDecimal;import java.sql.Date;
@Data@AllArgsConstructor@NoArgsConstructorpublic class Bill { private long id; // 账单编码 private String billCode; // 商品名称 private String productName; // 商品描述 private String productDesc; // 商品单位 private String productUnit; // 商品数量 private BigDecimal productCount; // 总金额 private BigDecimal totalPrice; // 是否支付 private int isPayment; // 创建者 private long createdBy; // 创建时间 private Date creationDate; // 更新者 private long modifyBy; // 更新时间 private Date modifyDate; // 供应商ID private long providerId; // 提供者的姓名 private String providerName;}- 编写Dao层的 Mapper接口!
- UserMapper.java
package com.github.mapper;
import com.github.pojo.User;import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper { public User findById(@Param("id") long id);
public User findByNameAndPassword(@Param("userName") String userName,@Param("password") String password);
public int updatePasswordById(@Param("id") long id,@Param("password") String password);
public int findUserCountByRoleIdAndUsername(@Param("id") long id,@Param("username") String username);
public List<User> findUserByRoleIdAndUsernameAndPageLimit(@Param("id") long id, @Param("username") String username, @Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
public int insertUser(User user);
public List<User> findAll();
public int deleteById(@Param("id") long id);
public int updateUser(User user);}- RoleMapper.java
package com.github.mapper;
import com.github.pojo.Role;import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface RoleMapper { public Role findById(@Param("id") long id); public List<Role> findAll();}- ProviderMapper.java
package com.github.mapper;
import com.github.pojo.Provider;import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ProviderMapper { public Provider findById(@Param("id") long id);
public List<Provider> findByCodeAndName(@Param("proCode") String proCode,@Param("proName") String proName);
public int insertProvider(Provider provider);
public int deleteById(long id);
public int updateProvider(Provider provider);
public List<Provider> findAll();}- BillMapper.java
package com.github.mapper;
import com.github.pojo.Bill;import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BillMapper { public Bill findById(@Param("id") long id);
public List<Bill> findByProductNameAndProviderIdAndIsPayment(@Param("productName") String productName,@Param("providerId") long providerId,@Param("isPayment") int isPayment);
public int insertBill(Bill bill);
public int deleteBill(@Param("id") long id);
public int updateBill(Bill bill);}- 编写接口对应的Mapper.xml 文件。需要导入MyBatis的包;
- UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.github.mapper.UserMapper">
<insert id="insertUser"> insert into smbms_user(id,userCode,userName,userPassword,gender,birthday,phone,address,userRole,createdBy,creationDate) values(null ,#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{phone},#{address},#{userRole},#{createdBy},#{creationDate}); </insert>
<update id="updatePasswordById"> update smbms_user set userPassword = #{password} where id = #{id}; </update>
<update id="updateUser"> update smbms_user set userName = #{userName} ,gender = #{gender},birthday = #{birthday},phone=#{phone},address=#{address},userRole = #{userRole},modifyBy=#{modifyBy},modifyDate=#{modifyDate} where id = #{id}; </update>
<delete id="deleteById"> delete from smbms_user where id = #{id}; </delete>
<select id="findById" resultType="com.github.pojo.User"> select * from smbms_user where id = #{id}; </select>
<select id="findByNameAndPassword" resultType="com.github.pojo.User"> select * from smbms_user where userCode = #{userName} and userPassword=#{password}; </select>
<select id="findUserCountByRoleIdAndUsername" resultType="java.lang.Integer"> select count(1) from smbms_user u ,smbms_role r where u.userRole = r.id <if test="id != 0"> and r.id = #{id} </if> <if test="username != null"> and u.userName like "%"#{username}"%" </if> </select>
<select id="findUserByRoleIdAndUsernameAndPageLimit" resultType="com.github.pojo.User"> select * from smbms_user u ,smbms_role r where u.userRole = r.id <if test="id != 0"> and r.id = #{id} </if> <if test="username != null"> and u.userName like "%"#{username}"%" </if> LIMIT #{startIndex},#{pageSize}; </select>
<select id="findAll" resultType="com.github.pojo.User"> select * from smbms_user; </select>
</mapper>- RoleMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.github.mapper.RoleMapper">
<select id="findById" resultType="com.github.pojo.Role"> select * from smbms_role where id = #{id}; </select> <select id="findAll" resultType="com.github.pojo.Role"> select * from smbms_role; </select></mapper>- ProviderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.github.mapper.ProviderMapper">
<insert id="insertProvider"> insert into smbms_provider(id,proCode,proName,proDesc,proContact,proPhone,proAddress,proFax,createdBy,creationDate) values(null,#{proCode},#{proName},#{proDesc},#{proContact},#{proPhone},#{proAddress},#{proFax},#{createdBy},#{creationDate}); </insert>
<update id="updateProvider"> update smbms_provider set proCode=#{proCode},proName =#{proName},proDesc=#{proDesc},proContact=#{proContact}, proPhone=#{proPhone},proAddress = #{proAddress},proFax=#{proFax},modifyDate=#{modifyDate}, modifyBy=#{modifyBy} where id = #{id}; </update>
<delete id="deleteById"> delete from smbms_provider where id =#{id}; </delete>
<select id="findById" resultType="com.github.pojo.Provider"> select * from smbms_provider where id = #{id}; </select>
<select id="findByCodeAndName" resultType="com.github.pojo.Provider"> select * from smbms_provider <where> <if test="proCode != null"> and proCode like "%"#{proCode}"%" </if> <if test="proName != null"> and proName like "%"#{proName}"%" </if> </where> </select>
<select id="findAll" resultType="com.github.pojo.Provider"> select * from smbms_provider; </select>
</mapper>- BillMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.github.mapper.BillMapper">
<insert id="insertBill"> insert into smbms_bill(id,billCode,productName,productDesc,productUnit,productCount,totalPrice,isPayment,createdBy,creationDate,providerId) values(null ,#{billCode},#{productName},#{productDesc},#{productUnit},#{productCount},#{totalPrice},#{isPayment},#{createdBy},#{creationDate},#{providerId}); </insert>
<update id="updateBill"> update smbms_bill set billCode=#{billCode},productName=#{productName},productDesc=#{productDesc}, productUnit=#{productUnit},productCount=#{productCount}, totalPrice=#{totalPrice},isPayment=#{isPayment},modifyBy=#{modifyBy}, modifyDate=#{modifyDate},providerId=#{providerId} where id = #{id}; </update>
<delete id="deleteBill"> delete from smbms_bill where id = #{id}; </delete>
<select id="findById" resultType="com.github.pojo.Bill"> select * from smbms_bill where id = #{id}; </select>
<select id="findByProductNameAndProviderIdAndIsPayment" resultType="com.github.pojo.Bill"> select * from smbms_bill <where> <if test="isPayment > 0"> and isPayment = #{isPayment} </if> <if test="productName != null"> and productName like "%"#{productName}"%" </if> <if test="providerId >0"> and providerId = #{providerId} </if> </where> </select>
</mapper>- 编写Service层实现类
- UserService.java
package com.github.service;
import com.github.mapper.UserMapper;import com.github.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;
import java.util.List;
@Servicepublic class UserService { @Autowired private UserMapper userMapper; public User login(String username,String password){ User byNameAndPassword = userMapper.findByNameAndPassword(username, password); if (byNameAndPassword == null){ return null; }else { return byNameAndPassword; } }
public boolean updatePasswordById(String password,long id){ int i = userMapper.updatePasswordById(id, password); if (i>0){ return true; }else { return false; } }
public int findUserCountByRoleIdAndUsername(long id,String username){ return userMapper.findUserCountByRoleIdAndUsername(id,username); }
public List<User> findUserByRoleIdAndUsernameAndPageLimit(long id, String username, int startIndex, int pageSize){ return userMapper.findUserByRoleIdAndUsernameAndPageLimit(id,username,startIndex,pageSize); }
public int insertUser(User user){ return userMapper.insertUser(user); }
public List<User> findAll(){ return userMapper.findAll(); }
public int deleteById(long id){ return userMapper.deleteById(id); }
public User findById(long id){ return userMapper.findById(id); }
public int updateUser(User user){ return userMapper.updateUser(user); }}- RoleService.java
package com.github.service;
import com.github.mapper.RoleMapper;import com.github.pojo.Role;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;
import java.util.List;
@Servicepublic class RoleService {
@Autowired private RoleMapper roleMapper;
public List<Role> findAll(){ return roleMapper.findAll(); }}- ProviderService.java
package com.github.service;
import com.github.mapper.ProviderMapper;import com.github.pojo.Provider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;
import java.util.List;
@Controllerpublic class ProviderService { @Autowired private ProviderMapper providerMapper;
public Provider findById(long id){ return providerMapper.findById(id); }
public List<Provider> findByCodeAndName(String proCode, String proName){ return providerMapper.findByCodeAndName(proCode,proName); }
public int insertProvider(Provider provider){ return providerMapper.insertProvider(provider); }
public int deleteById(long id){ return providerMapper.deleteById(id); }
public int updateProvider(Provider provider){ return providerMapper.updateProvider(provider); }
public List<Provider> findAll(){ return providerMapper.findAll(); }
}- BillService.java
package com.github.service;
import com.github.mapper.BillMapper;import com.github.mapper.ProviderMapper;import com.github.pojo.Bill;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;
import java.util.List;
@Controllerpublic class BillService {
@Autowired private BillMapper billMapper;
@Autowired private ProviderMapper providerMapper;
public Bill findById(long id){ Bill bill = billMapper.findById(id); bill.setProviderName(providerMapper.findById(bill.getProviderId()).getProName()); return bill; }
public List<Bill> findByProductNameAndProviderIdAndIsPayment(String productName, long providerId, int isPayment){ List<Bill> billList = billMapper.findByProductNameAndProviderIdAndIsPayment(productName, providerId, isPayment); for (Bill bill : billList) { bill.setProviderName(providerMapper.findById(bill.getProviderId()).getProName()); } return billList; }
public int insertBill(Bill bill){ return billMapper.insertBill(bill); }
public int deleteBill(long id){ return billMapper.deleteBill(id); }
public int updateBill(Bill bill){ return billMapper.updateBill(bill); }
}- 添加工具类
- Constants.java
package com.github.utils;
public class Constants { public final static String USER_SESSION = "userSession"; public final static int PAGE_SIZE = 5;}- PageSupport.java
package com.github.utils;
public class PageSupport { /** * 当前页码-来自于用户输入 */ private int currentPageNo = 1;
/** * 总记录数 */ private int totalCount = 0;
// 页面容量 private int pageSize = 0;
/** * 总页数-totalCount/pageSize(+1) */ private int totalPageCount = 1;
public int getCurrentPageNo() { return currentPageNo; }
public void setCurrentPageNo(int currentPageNo) { if(currentPageNo > 0){ this.currentPageNo = currentPageNo; } }
public int getTotalCount() { return totalCount; }
public void setTotalCount(int totalCount) { if(totalCount > 0){ this.totalCount = totalCount; // 设置总页数 this.setTotalPageCountByRs(); } } public int getPageSize() { return pageSize; }
public void setPageSize(int pageSize) { if(pageSize > 0){ this.pageSize = pageSize; } }
public int getTotalPageCount() { return totalPageCount; }
public void setTotalPageCount(int totalPageCount) { this.totalPageCount = totalPageCount; }
public void setTotalPageCountByRs(){ if(this.totalCount % this.pageSize == 0){ this.totalPageCount = this.totalCount / this.pageSize; }else if(this.totalCount % this.pageSize > 0){ this.totalPageCount = this.totalCount / this.pageSize + 1; }else{ this.totalPageCount = 0; } }
}- LoginFilter.java
package com.github.filter;
import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;
public class LoginFilter implements Filter {
@Override public void init(FilterConfig filterConfig) throws ServletException {
}
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); Object userSession = session.getAttribute("userSession"); if (userSession==null){ response.sendRedirect("/error.jsp"); }else { filterChain.doFilter(request,response); } }
@Override public void destroy() {
}}OK,到此,底层需求操作编写完毕!
3.Spring层
Section titled “3.Spring层”-
配置Spring整合MyBatis,这里数据源使用dataSource连接池;
-
编写Spring整合Mybatis的相关的配置文件;
- springDao-config.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--导入配置文件--> <context:property-placeholder location="classpath*:database.properties" />
<!--扫描包--> <context:component-scan base-package="com.github"/> <!--配置数据源,c3p0和druid也可以--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
<!--sqlFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!--配置mapper包扫描--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.github.mapper"/> </bean></beans>- springTx-config.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
<!--配置通知--> <tx:advice id="interceptor" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice>
<!--配置aop切入--> <aop:config> <aop:pointcut id="pointcut" expression="execution(* com.github..*.*(..))"/> <aop:advisor advice-ref="interceptor" pointcut-ref="pointcut"/> </aop:config></beans>4.SpringMVC层
Section titled “4.SpringMVC层”- springMVC-config.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: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/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--静态资源放行--> <mvc:default-servlet-handler/>
<!--json乱码处理,包括处理器映射器,处理器适配器,必须包含jackson的包--> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
<!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="suffix" value=".jsp"/> </bean>
</beans>- ApplicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:springDao-config.xml"/> <import resource="classpath:springTx-config.xml"/> <import resource="classpath:springMVC-config.xml"/></beans>- web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <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:ApplicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--乱码过滤--> <filter> <filter-name>encoding</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> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<filter> <filter-name>Login</filter-name> <filter-class>com.github.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>Login</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>
<welcome-file-list> <welcome-file>/login.jsp</welcome-file> </welcome-file-list></web-app>配置文件,暂时结束!Controller 和 视图层编写
5.案例实现
Section titled “5.案例实现”- UserController.java
package com.github.controller;
import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.github.pojo.Role;import com.github.pojo.User;import com.github.service.RoleService;import com.github.service.UserService;import com.github.utils.Constants;import com.github.utils.PageSupport;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;
@Controllerpublic class UserController {
@Autowired private UserService userService;
@Autowired private RoleService roleService;
@RequestMapping("login.do") public String login(String userCode , String userPassword, HttpSession session, HttpServletRequest request){ User user = userService.login(userCode, userPassword); if (user!=null){ session.setAttribute(Constants.USER_SESSION,user); return "redirect:/jsp/frame.jsp"; } request.setAttribute("error","用户名或者密码错误"); return "/login"; }
@RequestMapping("/jsp/logout.do") public String logout(HttpSession session){ session.removeAttribute(Constants.USER_SESSION); return "redirect:/login.jsp"; }
@RequestMapping("/jsp/updatePassword") public String updatePassword(String newPassword,HttpSession session,HttpServletRequest request){ System.out.println("newpassword=>"+newPassword); User attribute = (User) session.getAttribute(Constants.USER_SESSION); boolean flag = userService.updatePasswordById(request.getParameter("newPassword"), attribute.getId()); if (flag==true){ session.removeAttribute(Constants.USER_SESSION); return "redirect:/login.jsp"; }else { request.setAttribute("message","修改密码失败"); return "/jsp/pwdmodify"; } }
@RequestMapping("/jsp/verificationPassword") @ResponseBody public String verificationPassword(String oldpassword,HttpSession session) throws JsonProcessingException { User attribute = (User) session.getAttribute(Constants.USER_SESSION); Map<String,String> map = new HashMap<String,String>();
if (attribute==null){ map.put("result","sessionerror"); }else if (oldpassword==null||oldpassword.length()==0){ map.put("result","error"); }else if (!attribute.getUserPassword().equals(oldpassword)){ map.put("result","false"); } map.put("result","true"); ObjectMapper mapper = new ObjectMapper(); String s = mapper.writeValueAsString(map); return s; }
@RequestMapping("/jsp/queryUser") public String queryUser(Model model,Integer queryUserRole,String queryname,Integer pageIndex){ // 1. 查询出列表 // 2. 查询出总人数 // 3. 查询出role列表 // 4. 分页的支持 // 5. 回写数据 // 6. 跳转页面 if (queryUserRole==null){ queryUserRole = 0; } if (pageIndex == null){ pageIndex = 1; } int template = (pageIndex-1)*Constants.PAGE_SIZE; List<User> userList = userService.findUserByRoleIdAndUsernameAndPageLimit(queryUserRole, queryname, template, Constants.PAGE_SIZE); int totalCount = userService.findUserCountByRoleIdAndUsername(queryUserRole, queryname); List<Role> roleList = roleService.findAll(); PageSupport pageSupport = new PageSupport(); pageSupport.setPageSize(Constants.PAGE_SIZE); pageSupport.setTotalCount(totalCount); int totalPageCount = pageSupport.getTotalPageCount();
model.addAttribute("queryUserName",queryname); model.addAttribute("roleList",roleList); model.addAttribute("queryUserRole",queryUserRole); model.addAttribute("userList",userList); model.addAttribute("totalCount",totalCount); model.addAttribute("currentPageNo",""); model.addAttribute("totalPageCount",totalPageCount); model.addAttribute("currentPageNo",pageIndex);
return "/jsp/userlist"; }
@RequestMapping("/jsp/AddUser") public String addUser(String userCode, String userName, String userPassword, String ruserPassword, int gender, String birthday, String phone, String address,long userRole,Model model,HttpSession session) throws ParseException { if (ruserPassword==null||userPassword==null||!userPassword.equals(ruserPassword)){ model.addAttribute("message","输入异常,请重新输入"); return "/jsp/useradd"; } User user = new User(); user.setUserCode(userCode); user.setUserName(userName); user.setUserPassword(userPassword); user.setGender(gender); // 把字符串转换为日期对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date parse = dateFormat.parse(birthday); user.setBirthday(parse); user.setPhone(phone); user.setAddress(address); user.setUserRole(userRole); User userSession = (User) session.getAttribute(Constants.USER_SESSION); user.setCreatedBy(userSession.getId()); user.setCreationDate(new Date()); userService.insertUser(user); System.out.println("======================>"+user); model.addAttribute("message","添加成功"); return "/jsp/useradd"; }
@RequestMapping("/jsp/toUserAdd") public String toUserAdd(Model model){ List<Role> all = roleService.findAll(); model.addAttribute("roleList",all); return "/jsp/useradd"; }
// 验证账户名是否一样 @RequestMapping("/jsp/verifyAccount") @ResponseBody public String verifyAccount(String userCode) throws JsonProcessingException { Map<String, String> map = new HashMap<String, String>(); if (userCode==null||userCode.equals("")){ map.put("userCode","exist"); } List<User> userList = userService.findAll(); for (User user : userList) { if (user.getUserCode().equals(userCode)){ map.put("userCode","exist"); } } ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(map); }
@RequestMapping("/jsp/deleteUser") @ResponseBody public String deleteUser(long uid) throws JsonProcessingException { System.out.println("==========="+"进入方法了"+"==========="); Map<String,String> map = new HashMap<String, String>(); int i = userService.deleteById(uid); if (i<1){ map.put("delResult","false"); }else { map.put("delResult","true"); } ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(map); }
@RequestMapping("/jsp/viewUser") public String viewUser(long uid,Model model){ User user = userService.findById(uid); model.addAttribute("user",user); return "/jsp/userview"; }
@RequestMapping("/jsp/toUpdateUser") public String toUpdateUser(long uid,Model model){ User user = userService.findById(uid); model.addAttribute("user",user); List<Role> roleList = roleService.findAll(); model.addAttribute("roleList",roleList); return "/jsp/usermodify"; }
@RequestMapping("/jsp/updateUser") public String updateUser(long uid,String userName,int gender,String birthday, String phone,String address,long userRole,HttpSession session) throws ParseException { User user = new User(); user.setId(uid); user.setUserName(userName); user.setGender(gender); // 转换一下日期,因为前端不可以传日期对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date parse = dateFormat.parse(birthday); user.setBirthday(parse); user.setPhone(phone); user.setAddress(address); user.setUserRole(userRole); User userSession = (User) session.getAttribute(Constants.USER_SESSION); user.setModifyBy(userSession.getId()); user.setModifyDate(new Date()); userService.updateUser(user); return "redirect:/jsp/queryUser"; }}- TestController.java
package com.github.controller;
import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;
@Controller@RequestMapping("test")public class TestController { @ResponseBody @RequestMapping("theText") public String text(){ return "hello world"; }}- ProviderController.java
package com.github.controller;
import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.github.pojo.Provider;import com.github.pojo.User;import com.github.service.ProviderService;import com.github.utils.Constants;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;import java.sql.Date;import java.util.HashMap;import java.util.List;import java.util.Map;
@Controllerpublic class ProviderController {
@Autowired private ProviderService providerService; @RequestMapping("/jsp/queryProvider") public String queryProvider(String queryProCode, String queryProName, Model model){ List<Provider> providerList = providerService.findByCodeAndName(queryProCode, queryProName);
model.addAttribute("queryProCode",queryProCode); model.addAttribute("queryProName",queryProName); model.addAttribute("providerList",providerList); return "/jsp/providerlist"; }
@RequestMapping("/jsp/providerAdd") public String providerAdd(Model model,Provider provider, HttpSession session){ provider.setId(1); User userSession = (User) session.getAttribute(Constants.USER_SESSION); provider.setCreatedBy(userSession.getId()); provider.setCreationDate(new Date(new java.util.Date().getTime())); int i = providerService.insertProvider(provider); if(i>0){ model.addAttribute("message","添加成功"); }else { model.addAttribute("message","添加失败"); }
return "/jsp/provideradd"; }
@RequestMapping("/jsp/deleteProvider") @ResponseBody public String deleteProvider(long proid) throws JsonProcessingException { int flag = providerService.deleteById(proid); Map<String, String> map = new HashMap<String,String>(); if (flag>0){ map.put("delResult","true"); }else { map.put("delResult","false"); } ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(map); }
@RequestMapping("/jsp/viewProvider") public String viewProvider(long proid,Model model){ Provider provider = providerService.findById(proid); model.addAttribute("provider",provider); return "/jsp/providerview"; }
@RequestMapping("/jsp/updateProvider") public String updateProvider(Provider provider, HttpSession session){ User userSession = (User) session.getAttribute(Constants.USER_SESSION); provider.setModifyBy(userSession.getId()); provider.setModifyDate(new Date(new java.util.Date().getTime())); int i = providerService.updateProvider(provider); return "redirect:/jsp/queryProvider"; }
@RequestMapping("/jsp/toUpdateProvider") public String toUpdateProvider(long proid, Model model){ Provider provider = providerService.findById(proid); model.addAttribute("provider",provider); return "/jsp/providermodify"; }}- BillController.java
package com.github.controller;
import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.github.pojo.Bill;import com.github.pojo.Provider;import com.github.pojo.User;import com.github.service.BillService;import com.github.service.ProviderService;import com.github.utils.Constants;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;import java.sql.Date;import java.util.HashMap;import java.util.List;import java.util.Map;
@Controllerpublic class BillController {
@Autowired private BillService billService;
@Autowired private ProviderService providerService;
@RequestMapping("/jsp/queryBill") public String queryBill(Model model,String queryProductName, Integer queryProviderId, Integer queryIsPayment){
if (queryProviderId==null){ queryProviderId = 0; } if (queryIsPayment == null){ queryIsPayment = 0; } List<Provider> providerList = providerService.findAll(); List<Bill> billList = billService.findByProductNameAndProviderIdAndIsPayment(queryProductName, queryProviderId, queryIsPayment); model.addAttribute("queryProductName",queryProductName); model.addAttribute("queryProviderId",queryProviderId); model.addAttribute("queryIsPayment",queryIsPayment); model.addAttribute("billList",billList); model.addAttribute("providerList",providerList); return "/jsp/billlist"; }
@RequestMapping("/jsp/toBillAdd") public String toBillAdd(Model model){ List<Provider> providerList = providerService.findAll(); model.addAttribute("providerList",providerList); return "/jsp/billadd"; }
@RequestMapping("/jsp/billAdd") public String billAdd(Bill bill, HttpSession session){ bill.setId(0); User userSession = (User) session.getAttribute(Constants.USER_SESSION); bill.setCreatedBy(userSession.getId()); bill.setCreationDate(new Date(new java.util.Date().getTime())); billService.insertBill(bill); return "redirect:/jsp/queryBill"; }
@RequestMapping("/jsp/deleteBill") @ResponseBody public String deleteBill(long billid) throws JsonProcessingException { Map<String, String> map = new HashMap<String, String>(); if (billService.deleteBill(billid)>0){ map.put("delResult","true"); }else { map.put("delResult","false"); } ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(map); }
@RequestMapping("/jsp/viewBill") public String viewBill(long billid,Model model){ Bill b = billService.findById(billid); model.addAttribute("bill",b); return "/jsp/billview"; }
@RequestMapping("/jsp/toUpdateBill") public String toUpdateBill(long billid,Model model){ Bill b = billService.findById(billid); model.addAttribute("bill",b); List<Provider> providerList = providerService.findAll(); model.addAttribute("providerList",providerList); return "/jsp/billmodify"; }
@RequestMapping("/jsp/updateBill") public String updateBill(Bill bill, Model model, HttpSession session){ User userSession = (User) session.getAttribute(Constants.USER_SESSION); bill.setModifyBy(userSession.getId()); bill.setModifyDate(new Date(new java.util.Date().getTime()));
int i = billService.updateBill(bill); if (i>0){ model.addAttribute("message","修改成功"); }else { model.addAttribute("message","修改失败"); }
return "/jsp/billmodify"; }}运行结果如下:

6.遇到的问题
Section titled “6.遇到的问题”1.报错:Artifact smbms:war exploded: Error during artifact deployment. See server log for details.
- 解决:将所有的xml文件中的中文注释删除,重新配置Artifacts。

- 将原来的smbms:war exploded删除,然后再次更新下Build即可。

2.IDEA默认1.5导致代码错误
- 解决:在pom.xml中添加如下代码
<!--防止IDEA默认1.5的JDK--> <properties> <maven.compiler.source>1.9</maven.compiler.source> <maven.compiler.target>1.9</maven.compiler.target> </properties>3.mybatis的mapper.xml文件被漏掉
- 解决:在pom.xml中添加代码:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>4.字节的UTF-8序列的字节2失效:Invalid byte 2 of 2-byte UTF-8 sequence
- 原因:utf-8中xml文件中可能存在中文注解,可能在编译的时候出现乱码,导致无法识别。网上的大多办法是把utf-8改程gbk,不可行,因为我们项目的本身就是utf-8编码格式。
- 解决:在pom文件中添加
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>5.格林尼治时间转换问题
- 例如类型为 “Wed Apr 11 16:18:42 +0800 2012”,则对应掩码为 “EEE MMM dd HH:mm:ss z yyyy”;
- EEE-三位星期
- d-天
- MMM-月
- yyyy-四位年
- HH-24小时制消息
- mm-分钟
- ss-秒
- ‘GMT’-GMT字符串
- 别忘了加上单引号!
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.US);
map.put("birthday",format.parse(request.getParameter("birthday")));