KEEP ON CODING......

基于SpringMVC+Mybatis搭建简单的前后台交互系统

一、摘要

  1、所需软件列表:

    1) tomcat : apache-tomcat-7.0.54  服务端容器

    2) Intellij: Intellij IDEA 2016.3.1 开发工具  

    3) Syslog: SQLyog Community   数据库工具

  2. 步骤简述:

   1) 新建一个 Java 项目, 依次选择Spring--->Spring MVC--->Finish;

   2) web目录下新建前台页面相关目录(css/js/page等);

     3) WEB-INF文件夹下新建如下两个文件夹:
    lib: 用于存放项目相关jar包,项目如已导入maven可无视该步骤;
    resources: 用于存放Spring,Mybatis等相关配置文件。
    4)src目录下用于存放服务端相关代码

  完成后的工程目录如下:

  

二、Spring配置:

1、需要导入的包如下:

  

2、 相关配置文件

  1)web.xml配置(用于配置Spring 相关配置项:上下文、日志、字符集、监听器等)

<?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_3_1.xsd"
         version="3.1">

    <!-- 告知javaEE容器,哪些内容需要添加到上下文中去 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>

    <!-- 加载LOG4J -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.xml</param-value>
    </context-param>

    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>

    <!-- 动态设置项目的运行路径 -->
    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>mvc.root</param-value>
    </context-param>

    <!-- 配置静态资源 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/static/*</url-pattern>
    </servlet-mapping>


    <!-- 配置springmvc的前端控制器 -->
    <servlet>
        <servlet-name>mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 默认情况下:DispatcherServlet会寻找WEB-INF下,命名规范为[servlet-name]-servlet.xml文件。
        如:在上例中,它就会找/WEB-INF/mvc-servlet.xml
         如果需要修改,需要在web.xml中的<servlet>标记中增加 <init-param>。。。</init-param>:-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- spring框架提供的字符集过滤器 -->
    <!-- spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题  -->
    <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>/page/index.html</welcome-file>
    </welcome-file-list>
</web-app>

  2)spring-servlet.xml配置(用于配置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: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-3.0.xsd
    http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <bean id="fastJsonHttpMessageConverter"
          class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>application/json</value>
            </list>
        </property>
        <property name="features">
            <list>
                <!-- 输出key时是否使用双引号 -->
                <value>QuoteFieldNames</value>
                <!-- 是否输出值为null的字段 -->
                <value>WriteMapNullValue</value>
                <!-- 数值字段如果为null,输出为0,而非null -->
                <value>WriteNullNumberAsZero</value>
                <!-- List字段如果为null,输出为[],而非null -->
                <value>WriteNullListAsEmpty</value>
                <!-- 字符类型字段如果为null,输出为"",而非null -->
                <value>WriteNullStringAsEmpty</value>
                <!-- Boolean字段如果为null,输出为false,而非null -->
                <value>WriteNullBooleanAsFalse</value>
                <!-- null String不输出  -->
                <value>WriteNullStringAsEmpty</value>
                <!-- Date的日期转换器 -->
                <value>WriteDateUseDateFormat</value>
            </list>
        </property>
    </bean>
    <!-- 启动注解,注册服务,如验证框架、全局类型转换器-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <ref bean="fastJsonHttpMessageConverter" />
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 静态资源默认servlet配置
        (1)加入对静态资源的处理:js,gif,png
        (2)允许使用"/"做整体映射
        会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,
        是spring MVC为@Controllers分发请求所必须的。
        并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,
        读写XML的支持(JAXB,读写JSON的支持(Jackson
     -->
    <mvc:default-servlet-handler/>

    <!-- 启动自动扫描 -->
    <context:component-scan base-package="com.test">
        <!-- 制定扫包规则 ,只扫描使用@Controller注解的JAVA类 -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 配置视图解析器 -->
    <!--prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),
       比如传进来的逻辑视图名为WEB-INF/page/hello,则该该jsp视图页面应该存放在“WEB-INF/page/hello.html”; -->
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/page"></property>
        <property name="suffix" value=".html"></property>
    </bean>
</beans>

  3) datasource.properties(用于配置数据库文件)

jdbc.driver= com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
jdbc.username= root
jdbc.password= root

  4)  log4j.xml(用于配置记录日志文件)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "F:\SpringMybatis测试\SpringMVC_Mybatis\src\webapp\WEB-INF\conf\log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'
					 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
					 xsi:schemaLocation="http://jakarta.apache.org/log4j/ ">

	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%c %d{yyyy-MM-dd HH:mm:ss} -- %p -- %m%n"/>
		</layout>
	</appender>

	<appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${ssm.root}/ssm-debug.log"/>
		<param name="Append" value="true"/>
		<param name="MaxFileSize" value="10240KB"/>
		<param name="MaxBackupIndex" value="1000"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%c %d{yyyy-MM-dd HH:mm:ss} -- %p -- %m%n"/>
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="DEBUG"/>
			<param name="LevelMax" value="DEBUG"/>
		</filter>
	</appender>

	<appender name="INFO" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${ssm.root}/ssm-info.log"/>
		<param name="Append" value="true"/>
		<param name="MaxFileSize" value="10240KB"/>
		<param name="MaxBackupIndex" value="1000"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%c %d{yyyy-MM-dd HH:mm:ss} -- %p -- %m%n"/>
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="INFO"/>
			<param name="LevelMax" value="INFO"/>
		</filter>
	</appender>

	<appender name="WARN" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${ssm.root}/ssm-warn.log"/>
		<param name="Append" value="true"/>
		<param name="MaxFileSize" value="10240KB"/>
		<param name="MaxBackupIndex" value="1000"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%c %d{yyyy-MM-dd HH:mm:ss} -- %p -- %m%n"/>
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="WARN"/>
			<param name="LevelMax" value="WARN"/>
		</filter>
	</appender>

	<appender name="ERROR" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${ssm.root}/ssm-error.log"/>
		<param name="Append" value="true"/>
		<param name="MaxFileSize" value="10240KB"/>
		<param name="MaxBackupIndex" value="1000"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%c %d{yyyy-MM-dd HH:mm:ss} -- %p -- %m%n"/>
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="ERROR"/>
			<param name="LevelMax" value="ERROR"/>
		</filter>
	</appender>

	<root>
		<priority value="INFO"/>
		<appender-ref ref="STDOUT"/>
		<appender-ref ref="DEBUG"/>
		<appender-ref ref="INFO"/>
		<appender-ref ref="WARN"/>
		<appender-ref ref="ERROR"/>
	</root>

</log4j:configuration>

  5) log4j,dtd(主要是对相应.xml进行约束验证用的)

<?xml version="1.0" encoding="UTF-8" ?>

<!ELEMENT log4j:configuration (renderer*, throwableRenderer?,
                               appender*,plugin*, (category|logger)*,root?,
                               (categoryFactory|loggerFactory)?)>

<!ATTLIST log4j:configuration
  xmlns:log4j              CDATA #FIXED "http://jakarta.apache.org/log4j/" 
  threshold                (all|trace|debug|info|warn|error|fatal|off|null) "null"
  debug                    (true|false|null)  "null"
  reset                    (true|false) "false"
>

<!ELEMENT renderer EMPTY>
<!ATTLIST renderer
  renderedClass  CDATA #REQUIRED
  renderingClass CDATA #REQUIRED
>

<!ELEMENT throwableRenderer (param*)>
<!ATTLIST throwableRenderer
  class  CDATA #REQUIRED
>

<!ELEMENT appender (errorHandler?, param*,
      rollingPolicy?, triggeringPolicy?, connectionSource?,
      layout?, filter*, appender-ref*)>
<!ATTLIST appender
  name 		CDATA 	#REQUIRED
  class 	CDATA	#REQUIRED
>

<!ELEMENT layout (param*)>
<!ATTLIST layout
  class		CDATA	#REQUIRED
>

<!ELEMENT filter (param*)>
<!ATTLIST filter
  class		CDATA	#REQUIRED
>

<!ELEMENT errorHandler (param*, root-ref?, logger-ref*,  appender-ref?)> 
<!ATTLIST errorHandler
   class        CDATA   #REQUIRED 
>

<!ELEMENT root-ref EMPTY>

<!ELEMENT logger-ref EMPTY>
<!ATTLIST logger-ref
  ref CDATA #REQUIRED
>

<!ELEMENT param EMPTY>
<!ATTLIST param
  name		CDATA   #REQUIRED
  value		CDATA	#REQUIRED
>

<!ELEMENT priority (param*)>
<!ATTLIST priority
  class   CDATA	#IMPLIED
  value	  CDATA #REQUIRED
>
<!ELEMENT level (param*)>
<!ATTLIST level
  class   CDATA	#IMPLIED
  value	  CDATA #REQUIRED
>

<!ELEMENT category (param*,(priority|level)?,appender-ref*)>
<!ATTLIST category
  class         CDATA   #IMPLIED
  name		CDATA	#REQUIRED
  additivity	(true|false) "true"  
>

<!ELEMENT logger (param*,level?,appender-ref*)>
<!ATTLIST logger
  class         CDATA   #IMPLIED
  name		CDATA	#REQUIRED
  additivity	(true|false) "true"  
>


<!ELEMENT categoryFactory (param*)>
<!ATTLIST categoryFactory 
   class        CDATA #REQUIRED>

<!ELEMENT loggerFactory (param*)>
<!ATTLIST loggerFactory
   class        CDATA #REQUIRED>

<!ELEMENT appender-ref EMPTY>
<!ATTLIST appender-ref
  ref CDATA #REQUIRED
>

<!-- plugins must have a name and class and can have optional parameters -->
<!ELEMENT plugin (param*, connectionSource?)>
<!ATTLIST plugin
  name 		CDATA 	   #REQUIRED
  class 	CDATA  #REQUIRED
>

<!ELEMENT connectionSource (dataSource?, param*)>
<!ATTLIST connectionSource
  class        CDATA  #REQUIRED
>

<!ELEMENT dataSource (param*)>
<!ATTLIST dataSource
  class        CDATA  #REQUIRED
>

<!ELEMENT triggeringPolicy ((param|filter)*)>
<!ATTLIST triggeringPolicy
  name 		CDATA  #IMPLIED
  class 	CDATA  #REQUIRED
>

<!ELEMENT rollingPolicy (param*)>
<!ATTLIST rollingPolicy
  name 		CDATA  #IMPLIED
  class 	CDATA  #REQUIRED
>

<!ELEMENT root (param*, (priority|level)?, appender-ref*)>

<!ELEMENT log4j:eventSet (log4j:event*)>
<!ATTLIST log4j:eventSet
  xmlns:log4j             CDATA #FIXED "http://jakarta.apache.org/log4j/" 
  version                (1.1|1.2) "1.2" 
  includesLocationInfo   (true|false) "true"
>

<!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, 
                       log4j:locationInfo?, log4j:properties?) >

<!ATTLIST log4j:event
    logger     CDATA #REQUIRED
    level      CDATA #REQUIRED
    thread     CDATA #REQUIRED
    Date  CDATA #REQUIRED
    time       CDATA #IMPLIED
>

<!ELEMENT log4j:message (#PCDATA)>
<!ELEMENT log4j:NDC (#PCDATA)>

<!ELEMENT log4j:throwable (#PCDATA)>

<!ELEMENT log4j:locationInfo EMPTY>
<!ATTLIST log4j:locationInfo
  class  CDATA	#REQUIRED
  method CDATA	#REQUIRED
  file   CDATA	#REQUIRED
  line   CDATA	#REQUIRED
>

<!ELEMENT log4j:properties (log4j:data*)>

<!ELEMENT log4j:data EMPTY>
<!ATTLIST log4j:data
  name   CDATA	#REQUIRED
  value  CDATA	#REQUIRED
>

 6)applicationContext.xml(Mybatis sqlSessionFactoryBuilder相关配置及Spring AOP等)

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!-- 开启自动扫包 -->
    <context:component-scan base-package="com.test">
        <!--制定扫包规则,不扫描@Controller注解的JAVA类,其他的还是要扫描  -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 启动AOP支持 -->
    <aop:aspectj-autoproxy/>

    <!-- 引入外部数据源配置信息 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:datasource.properties</value>
        </property>
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!-- 配置Session工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!-- 加载mybatis.mapper.xml文件 -->
        <property name="mapperLocations" value="classpath*:UserMapper.xml"></property>
        <!-- 自动扫描需要定义类别名的包,将包内的JAVA类的类名作为类别名 -->
        <property name="typeAliasesPackage" value="com.test.pojo"></property>
    </bean>

    <!-- 自动扫描所的Mapper接口与文件 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.test.dao"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 定义操作通知,指定事务管理器 -->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="delete*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="save*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="update*" propagation="REQUIRED" read-only="false"
                       rollback-for="java.lang.Exception" />
            <tx:method name="load*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="search*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <!-- 配置一个切入点 -->
        <aop:pointcut id="serviceMethods" expression="execution(* com.test.service.impl.*ServiceImpl.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>

</beans>

  7) UserMapper.xml(Mybatis 配置文件,用于生成所需的SQL)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.UserDAO">
    <!-- 自定义返回结果集 -->
    <resultMap id="userMap" type="com.test.pojo.UserBean" >
        <id property="id" column="id" javaType="java.lang.Integer"></id>
        <result property="name" column="name" javaType="java.lang.String"></result>
        <result property="age" column="age" javaType="java.lang.Integer"></result>
    </resultMap>

    <!--查-->
    <select id="selectAllUser" resultMap="userMap">
		select * from user
	</select>

    <!--#{}:占位符,可用于替换动态内容,防止SQL注入
    %{}:拼接sql串,可用于替换静态内容,如表名,数据库连接方式等,不能防止sql注入-->
    <!--根据id查询单个用户-->
    <select id="selectSingleUser" parameterType="java.lang.Integer" resultMap="userMap">
        select * from user
        <if test=" id != null">
            where id=#{id,jdbcType=INTEGER}
        </if>
    </select>

    <select id="countUsers" resultType="int">
		select count(*) from user where 1=1
	</select>

    <!--choose, when, otherwise: 等价于swicth case条件执行查询语句
    bind: 用于执行左右模糊匹配字段的查询-->
    <select id="selectOneUserInfo" resultMap="userMap">
        select * from user
        <!--<choose>-->
        <!--<when test="id != null">-->
        <!--where id=#{id,jdbcType=INTEGER}-->
        <!--</when>-->
        <!--<when test="name != null">-->
        <!--where name like #{name}-->
        <!--</when>-->
        <!--<otherwise>-->
        <!--where 1=1-->
        <!--</otherwise>-->
        <!--</choose>-->
        <where>
            <if test="id != null">
                id=#{id,jdbcType=INTEGER}
            </if>
            <if test="name != null">
                <bind name="username" value="'%' + name + '%'" />
                and name like #{username}
            </if>
        </where>
    </select>

    <!--增-->
    <!--如果数据库支持自动生成主键的字段,可以使用useGeneratedKys+keyProperty字段来制定主键-->
    <insert id="insertUser" parameterType="java.util.List" useGeneratedKeys="true"
            keyProperty="id">
        insert into user (id, name, age) values
        <foreach collection="list" item="user" separator=",">
            (#{user.id},#{user.name},#{user.age})
        </foreach>
    </insert>

    <!--改-->
    <update id="updateUserInfo">
        update user
        <set>
            <if test="user.id != null">id=#{user.id},</if>
            <if test="user.name != null">name=#{user.name},</if>
            <if test="user.age != null">age=#{user.age}</if>
        </set>
        where id=#{id}
    </update>

    <!--删-->
    <delete id="deleteUser">
        delete from user
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="id != null">
                WHERE id = #{id,jdbcType=INTEGER}
            </if>
            <!--<if test="name != null and name.length()>0">-->
                <!--AND WHERE name = #{name}-->
            <!--</if>-->
        </trim>
    </delete>
</mapper>

 三、 服务端代码

  服务端代码使用MVC模式,使得视图(界面显示)、模型(数据)及控制器(业务逻辑)三者分离的方式组织代码,将业务逻辑聚集到一个部件里,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
具体的编码实现如下:

1)User实体类:

package com.test.pojo;

public class UserBean{
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 2) 控制器类:

package com.test.controller;

import com.test.pojo.UserBean;
import com.test.service.UserService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.jws.WebMethod;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@RestController()
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
    public List getUserInfo() throws Exception {
        return userService.getAllUsers();
    }

    @RequestMapping(value = "/getSingleUser", method = RequestMethod.GET)
    public UserBean getSingleUser(@Param("id") String id) throws Exception {
        //return userService.getSingleUsers(id);
        return userService.getUserInfo(id);
    }

    @RequestMapping(value = "/getOneUserInfo", method = RequestMethod.GET)
    public UserBean getSingleUser(@Param("id") String id, @Param("name") String name) throws Exception {
        return userService.getOneUserInfo(id, name);
    }

    @RequestMapping(value = "/getUserCount", method = RequestMethod.GET)
    public int getUserCountForAllUsers() throws Exception {
        return userService.getUsersCount();
    }

    @RequestMapping(value = "updateUser")
    public void updateUserInfo(){
        userService.updateUserInfo();
    }

    @RequestMapping(value = "/addUsers", method = RequestMethod.GET)
    public void addUsers(List<UserBean> list) throws Exception {
        List<UserBean> users = new ArrayList<>();
        UserBean user1 = new UserBean();
        user1.setAge(28);
        user1.setId(12);
        user1.setName("Mr One");
        UserBean user2 = new UserBean();
        user2.setAge(31);
        user2.setId(11);
        user2.setName("Mr Two");
        users.add(user1);
        users.add(user2);
        userService.addUsers(list);
    }

    @RequestMapping(value = "/deleteUser", method = RequestMethod.GET)
    public void deleteUser(@Param("id") String id, @Param("name")String name) throws Exception {
        userService.deleteUser(id, name);
    }
}

  3) 数据库操作类UserDAO:(定义为接口方式,serviceImpl用来实现具体的增删改查操作,可以使用Mybatis映射器方式直接拼写SQL(注释掉的@Select("")等), 也可以定义UserMapper.xml文件用来通过配置文件生成SQL)

package com.test.dao;

import com.test.pojo.UserBean;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;

public interface UserDAO {

    List<UserBean> selectAllUser() throws Exception;

    //@Select("select * from user where id=#{id}") ---映射器方式:入参需要改为String类型
    UserBean selectSingleUser(@Param("id") Integer id);

    //@Select("select * from user where id=#{id} and name=#{name}") ---映射器方式:入参需要改为String类型
    UserBean selectOneUserInfo(@Param("id") Integer id, @Param("name") String name);

    int countUsers();

    void insertUser(@Param("list") List<UserBean> list);

//    @Delete("delete from user where id=#{id}")
    void deleteUser(@Param("id") Integer id, @Param("name") String name) throws Exception;

    void updateUserInfo(@Param("id")Integer id, @Param("user") UserBean user);

    @Select("select * from user where id=#{id}")
    UserBean getUserInfo(@Param("id") String id);
}

  4) UserService(数据库操作接口类)

package com.test.service;

import com.test.pojo.UserBean;

import java.util.List;

public interface UserService {

    List<UserBean> getAllUsers() throws Exception;

    void addUsers(List<UserBean> list);

    void deleteUser(String id, String name) throws Exception;

    UserBean getSingleUsers(String id);

    int getUsersCount();

    UserBean getOneUserInfo(String id, String name);

    void updateUserInfo();

    UserBean getUserInfo(String id);
} 

  5)UserServiceImpl(UserService的实现类)

package com.test.service.impl;

import com.test.dao.UserDAO;
import com.test.pojo.UserBean;
import com.test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("user")
public class UserServiceImpl implements UserService {

    @Autowired(required = false)
    UserDAO userDAO;

    @Override
    public List<UserBean> getAllUsers() throws Exception {
        return userDAO.selectAllUser();
    }

    @Override
    public UserBean getSingleUsers(String id) {
        return userDAO.selectSingleUser(Integer.parseInt(id));
    }

    @Override
    public int getUsersCount() {
        return userDAO.countUsers();
    }

    @Override
    public void addUsers(List<UserBean> list) {
        userDAO.insertUser(list);
    }

    @Override
    public void deleteUser(String id, String name) throws Exception {
        userDAO.deleteUser(Integer.parseInt(id), name);
    }

    @Override
    public UserBean getOneUserInfo(String id, String name) {
        if(id != null && !"".equals(id)){
            if(name != null){
                return userDAO.selectOneUserInfo(Integer.parseInt(id), name);
            }else{
                return userDAO.selectOneUserInfo(Integer.parseInt(id), null);
            }
        }else {
            return userDAO.selectOneUserInfo(null, name);
        }
    }

    @Override
    public void updateUserInfo() {
        UserBean user = new UserBean();
        user.setId(3);
        user.setAge(33);
        user.setName("haha");
        userDAO.updateUserInfo(1, user);
    }

    @Override
    public UserBean getUserInfo(String id) {
        return userDAO.getUserInfo(id);
    }
}

四、客户端文件:

  本例只使用了静态页面作为初始化加载的界面展示,路径为:web/page/index.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<h1>This is a test Page for Spring Test</h1>

</body>
</html> 

  本例中的返回信息使用了Alibaba的fastJson作为返回对象(未使用视图解析器),故界面ajax请求返回数据可根据返回值作为数据填充,具体的界面设计需要自由发挥。

五、 Tomcat配置:

  两种方式查看:

  1. 配置Tomcat文件:

    1)将web文件夹放入 tomcat 解压包的 apache-tomcat-7.0.54\webapps\ 目录下;

    2) 将编译后的jar包放入 WEB-INF 目录下的lib文件夹下

    3)启动Tomcat

  2. IntelliJ 集成了Tomcat 插件,可以直接启动,具体配置路径如下:
    Run--->Edit Configurations--->"+"--->Tomcat Server--->Local 或者 Remote选项配置
    (注意Deployment Tab页下要将对应的war包导入)
    然后启动即可

 

posted @ 2018-01-09 16:24  Cecil2020  阅读(497)  评论(0编辑  收藏  举报