ssm框架整合:
1.配置springMVC
a. 导入相关jar包,这里我不做演示
b. 配置web.xml中的前端控制器,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>*.action</url-pattern>
</servlet-mapping>
<!--配置全站乱码解决过滤器-->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
c. 配置springMVC.xml中的包扫描,注解方式mvc,视图解析器
<!--配置包扫描-->
<context:component-scan base-package="cn.tedu.controller"/>
<!--注解方式mvc-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
2.配置spring
a.在核心配置文件applicationContext.xml中开启spring三件套
<!--配置包扫描-->
<context:component-scan base-package="cn.tedu"/>
<!--注解方式DI-->
<context:annotation-config/>
<!--注解方式AOP-->
<aop:aspectj-autoproxy/>
b.在web.xml中配置监听文件,这样就可以在web项目启动的时候,自动启动spring容器初始化了。
<!--配置监听器,在tomcat容器初始化时初始化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>
3.配置mybatis
a.创建一个sqlMapConfig.xml文件,之前配置mybatis时也有该文件,在整合里也需要他,但是里面都不写东西,创建了就可以。
<?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>
</configuration>
b.在applicationContext.xml中配置下面写的很清楚,需要做解释的是MyBatis MapperBean扫描器,负责为MapperBean生成实现类这一段配置的代码,后面会做解释。
事务管理器是之前spring整合jdbc的重点,只要写了这个配置,就可以在需要添加事务的方法上添加@Transactional()来进行事务的管理。
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///easymall"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
<!-- 整合MyBatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:/sqlMapConfig.xml"></property>
<property name="mapperLocations" value="classpath:/mappers/*.xml"></property>
</bean>
<!-- MyBatis MapperBean扫描器,负责为MapperBean生成实现类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.tedu.mapper"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven/>
c.写一个bean,然后创建该bean的映射文件,还要写一个该映射文件的实现接口。这里就来解释上面的那个代码,当在dao层使用UserMapper的DI,那么就是通过上面的代码来生成实例对象,注入到UserMapper中,然后通过调用UserMapper中的方法,来调用到映射文件中的sql,同时映射文件中的resultType="cn.tedu.domain.User"表明了封装类型,所以查出来的数据就封装到了user这个对象中,然后再返回去。
//映射文件
<?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="cn.tedu.mapper.UserMapper">
<select id="queryUserByUsername" resultType="cn.tedu.domain.User">
select * from user where username = #{username};
</select>
<insert id="addUser">
insert into user values (null,#{username},#{password},#{nickname},#{email});
</insert>
<select id="queryUserByUsernameAndPsw" resultType="cn.tedu.domain.User">
select * from user where username = #{username} and password=#{password};
</select>
</mapper>
//映射文件的接口
public interface UserMapper {
/**
* 根据用户名查找用户
*/
public User queryUserByUsername(@Param("username") String username);
/**
* 新增用户
*/
void addUser(User user);
/**
* 根据用户名密码查询用户
*/
User queryUserByUsernameAndPsw(@Param("username") String username,@Param("password") String password);
}
注册案例:
a.前端:
关于信息验证:
非空验证:前端使用jQuery进行非空验证,同时后端也需要,因为有的人可能会绕过前端来进行表达那的提交。
输入信息合法性验证:和非空验证同理。
信息已存在验证:这里通过Ajax来实现,使用blur事件来绑定输入框,进行后台验证。
前端非空验证,合法性验证:
重复性验证:
再让我们看看表单提交的地址,可以看到这是一个action结尾的地址,意思就是这是一个controller,表单是提交到了控制器那里。
b. controller层
需要注意的是,注册的这个jsp页面是放在web-inf目录下的,是无法直接通过浏览器的地址栏获取的,所以就需要写一个控制器来跳转这个页面。
这里使用的RESTFul风格来获取到这个jsp的名字,然后再内部通过转发的方式,让视图解析器来让浏览器获取到这个页面。
再可以成功访问到这个注册页面后,填写完正确的注册信息,点击提交,就会去寻找/user/regist.action这个地址,这个地址可以看出,它也是一个控制器的地址,通过requestMapping注解过的地址,来找到对应的controller。
找到该controller后,就开始进行如下图一操作。这里说一下@valid注解,这是一个springMVC自带的表单验证,当你使用了它后,表示user需要进行表单验证,在user类中是这么个样子的如图二,在属性上加上这类注解,就表示该属性需要验证,如果验证有问题,就放入message中,后面就可以从err对象中获取异常类型和信息。
图一:
图二:
c. service层:
userMapper是一个接口,它是映射文件userMapper.xml中的sql,之前在配置文件中,给他配置了实例,所以这里实际上是一个底层给的实例来调用方法,方法就是userMapper.xml中写的sql。
d. DAO 层
下图就是写slq的映射文件,和映射文件对应的接口形式,其中红框的都是要一致的,查出来的数据没有异常就会自动封装,然后层层上报。
映射文件:
映射文件的接口形式: