SSM框架整合与模板

一、Maven配置

(1)所有依赖

1.pom.xml

    <dependencies>
<!-- junit 数据库驱动 连接池 servlet jsp  mybatis mybatis-spring spring springmvc        -->

        <!--Junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

        <!--Servlet - JSP -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!--Mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

        <!--Spring-->
        <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.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.9</version>
        </dependency>
        <!--事务织入-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.5</version>
        </dependency>
        <!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>


    </dependencies>

(2)资源过滤配置

    <build>
    <!--必须配置如下!!,只有这样在src/main/java的mapper.xml文件才能编译导出,否则在mybatis使用时会出错!!-->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
        <!--    必须配置的结束-->
    </build>

二、Mybatis配置

java项目结构:

(1)mybatis-config.xml

<?xml version="1.0" encoding="UTF8" ?>
<!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"/>
    </settings>

    <!--    取别名-->
    <typeAliases>
        <package name=【"com.gy.pojo"】/>
    </typeAliases>

</configuration>

三、Spring配置

(1)Spring整合Mybatis

1.spring-dao.xml

<?xml version="1.0" encoding="UTF8"?>
<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"
       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
         http://www.springframework.org/schema/aop
         https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--    1.关联配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--    2.连接池
             dbcp   :半自动,手动连接
             c3p0   :全自动连接(自动化的加载配置文件,并且可以自动设置到对象中)
             druid  : 强大-->
    <!--        必须用jdbc.属性 否则报错-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--基本属性配置-->
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- c3p0连接池的私有属性 initialPoolSize必须配置-->
        <property name="initialPoolSize" value="10"/>
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!-- 关闭连接后不自动commit -->
        <property name="autoCommitOnClose" value="false"/>
        <!-- 获取连接超时时间 -->
        <property name="checkoutTimeout" value="10000"/>
        <!-- 当获取连接失败重试次数 -->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!--    3.sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value=【"classpath:com/gy/mapper/*.xml"】/>
    </bean>

    <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
    <!-- 好处:不用写BookMapperImpl实现类,不需要先sqlSession.getMapper()后再queryBook(),
    而是业务层直接bookMapper.queryBook()使用即可-->
    <!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value=【"com.gy.mapper"】/>
    </bean>


</beans>

2.jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/【mybatis】?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=\密\码

(2)Spring整合Service(业务层)

1.spring-service.xml

<?xml version="1.0" encoding="UTF8"?>
<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.xsd
        http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/aop
         https://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--    1.扫描包-->
    <context:component-scan base-package=["com.gy.service"/>

    <!--    2.注入(采用注解方式注入)-->

    <!--    3.开启声明式事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!--    结合AOP实现事务的织入 别人已经写好这个通知,直接使用即可-->
    <!--    配置事务通知(增强)注意需要tx的命名空间-->
    <tx:advice id="tx">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--配置事务切入点-->
    <aop:config>
        <aop:pointcut id="txPoint" expression=["execution(* com.gy.service.*.* (..))"/>
        <aop:advisor advice-ref="tx" pointcut-ref="txPoint"/>
    </aop:config>

</beans>

四、SpringMVC

(1)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">
    <!--    DispatchServlet-->
    <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>
        <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>

    <!--    session超时时间-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
    <!--配置jstl标签库-->
    <jsp-config>
        <taglib>
            <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
            <taglib-location>/WEB-INF/lib/c.tld</taglib-location>
        </taglib>
    </jsp-config>
    
</web-app>

(2)spring-mvc.xml

<?xml version="1.0" encoding="UTF8"?>
<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.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
    ">
    <!--    自动扫描指定包下的类,实现通过注解注入bean-->
    <context:component-scan base-package="com.gy.controller"/>
    <!--    让Springmvc不处理静态文件 比如 .css .js .mp4等,跳过springmvc处理-->
    <mvc:default-servlet-handler/>
    <!--    自动配置BeanNameUrlHandlerMapping和SimpleControllerHandlerAdapter -->
    <mvc:annotation-driven/>

    <!--视图解析器 DispatcherServlet 给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--        前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--        后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--解决json 乱码配置-->
    <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>
</beans>

五、合并applicationContext.xml

<?xml version="1.0" encoding="UTF8"?>
<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: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/context
         https://www.springframework.org/schema/context/spring-context.xsd
                 http://www.springframework.org/schema/mvc
         https://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://www.springframework.org/schema/aop
         https://www.springframework.org/schema/aop/spring-aop.xsd">

    <import resource="spring-dao.xml"/>
    <import resource="spring-service.xml"/>
    <import resource="spring-mvc.xml"/>
<!--开启注解-->
    <context:annotation-config/>

</beans>

六、三个层次的项目代码

  (1)pojo/Books.java

package com.gy.pojo;

public class Books {

    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;

    public Books() {
    }

    public Books(int bookID, String bookName, int bookCounts, String detail) {
        this.bookID = bookID;
        this.bookName = bookName;
        this.bookCounts = bookCounts;
        this.detail = detail;
    }

    public int getBookID() {
        return bookID;
    }

    public void setBookID(int bookID) {
        this.bookID = bookID;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public int getBookCounts() {
        return bookCounts;
    }

    public void setBookCounts(int bookCounts) {
        this.bookCounts = bookCounts;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }
    
    @Override
    public String toString() {
        return "Books{" +
                "bookID=" + bookID +
                ", bookName='" + bookName + '\'' +
                ", bookCounts=" + bookCounts +
                ", detail='" + detail + '\'' +
                '}';
    }
}

(2)Mapper层

1.BookMapper.java

package com.gy.mapper;

import com.gy.pojo.Books;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;
@Component
public interface BookMapper {
//    增加一本书
    int addBook(Books books);
//    删一本书
    int deleteBookByID(@Param("bookID") Integer id);
//    改一本书
    int updateBook(Books books);
//    查所有书
    List<Books> queryBooks();
//    查一本书
    Books queryBookByID(@Param("bookID") Integer id);
//    通过书名查询
    List<Books> queryBookByBookName(@Param("bookName") String bookName);

}

2.BookMapper.xml

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gy.mapper.BookMapper">

    <insert id="addBook" parameterType="Books">
        insert into ssmbuild.books(bookName, bookCounts, detail)
        values (#{bookName},#{bookCounts},#{detail});
    </insert>

    <delete id="deleteBookByID" parameterType="_int">
        delete from ssmbuild.books
        where bookID=#{bookID};
    </delete>

    <update id="updateBook" parameterType="Books">
        update ssmbuild.books
        <set>
            <if test="bookName!=''">
                bookName = #{bookName},
            </if>
            <if test="bookCounts!=null">
                bookCounts = #{bookCounts},
            </if>
            <if test="detail!=''">
                detail = #{detail},
            </if>
        </set>
        where bookID=#{bookID};
    </update>

    <select id="queryBooks" resultType="Books">
        select *
        from ssmbuild.books;
    </select>

    <select id="queryBookByID" resultType="Books" parameterType="_int">
        select * from ssmbuild.books where bookID=#{bookID};
    </select>

    <select id="queryBookByBookName" resultType="Books" parameterType="String">
        select * from ssmbuild.books where bookName like #{bookName};
    </select>

</mapper>

(3)service层

1.BookService.java

      与bookMapper接口方法一致,项目大了也可以不一致

package com.gy.service;

import com.gy.pojo.Books;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BookService {
    //    增加一本书
    int addBook(Books books);
    //    删一本书
    int deleteBookByID(@Param("bookID") Integer id);
    //    改一本书
    int updateBook(Books books);
    //    查所有书
    List<Books> queryBooks();
    //    查一本书
    Books queryBookByID(@Param("bookID") Integer id);
    //    通过书名查询
    List<Books> queryBookByBookName(@Param("bookName") String bookName);
}

2.BookServiceImpl

package com.gy.service.impl;

import com.gy.mapper.BookMapper;
import com.gy.pojo.Books;
import com.gy.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookServiceImpl implements BookService {

    private BookMapper bookMapper;


    @Autowired
    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }

    public int addBook(Books books) {
        return bookMapper.addBook(books);
    }

    public int deleteBookByID(Integer id) {
        return bookMapper.deleteBookByID(id);
    }

    public int updateBook(Books books) {
        return bookMapper.updateBook(books);
    }

    public List<Books> queryBooks() {
        return bookMapper.queryBooks();
    }

    public Books queryBookByID(Integer id) {
        return bookMapper.queryBookByID(id);
    }

    public List<Books> queryBookByBookName(String bookName) {
        return bookMapper.queryBookByBookName("%"+bookName+"%");
    }
}

(4)Controller层

1.BookController.java

package com.gy.controller;

import com.gy.pojo.Books;
import com.gy.service.BookService;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
public class BookController {

    private BookService bookService;

    @Autowired
    public void setBookService(BookService bookService) {
        this.bookService = bookService;
    }

    //  罗列出所有书本信息
    @RequestMapping("/book/allBook")
    public String list(Model model) {
//        调用业务层
        List<Books> books = bookService.queryBooks();
        model.addAttribute("list", books);
        return "allBook";
    }

    //跳转至添书界面
    @RequestMapping("/book/toAddBook")
    public String toAddPage() {
        return "addBook";
    }

    //添书页面
    @RequestMapping("/book/addBook")
    public String addBook(Books book) {
        System.out.println(book);
        bookService.addBook(book);
        return "redirect:/book/allBook";
    }

    //    跳转到修改书的页面
    @RequestMapping("/book/toUpdateBook")
    public String toUpdateBook(@RequestParam("bookID") Integer bookID, Model model) {
        Books book = bookService.queryBookByID(bookID);
        model.addAttribute("book", book);
        return "updateBook";
    }

    //    修改书页面
    @RequestMapping("/book/updateBook")
    public String updateBook(Books book) {
        System.out.println(book);
        bookService.updateBook(book);
        return "redirect:/book/allBook";
    }

    //    删除书操作
    @RequestMapping("/book/deleteBook")
    public String delete(@RequestParam("bookID") Integer bookID) {
        bookService.deleteBookByID(bookID);
        return "redirect:/book/allBook";
    }

    //    查询书名操作
    @RequestMapping("/book/queryBookByBookName")
    public String queryBookByBookName(@RequestParam("bookName") String bookName, Model model) {
        List<Books> books = bookService.queryBookByBookName(bookName);
        if (books.size() == 0) {
            books = bookService.queryBooks();
            model.addAttribute("error", "未查到结果");
        }
        model.addAttribute("list", books);
        model.addAttribute("QBookName", bookName);
        return "allBook";
    }

    @RequestMapping("/book/ajaxAllBook")
    @ResponseBody
    public List<Books> ajaxAllBook(Model model, HttpServletRequest request) {
        return bookService.queryBooks();
    }


    @RequestMapping("/book/ajaxAllBookPage")
    public String ajaxAllBookPage(Model model) {
        return "ajaxAllBook";
    }

}

七、Json

(1)后端

参考以下BookController.java的方法以及注释

    //需要Jackson的jar包,pom.xml已经导入
    @RequestMapping("/book/ajaxAllBook") //方法访问地址
    @ResponseBody // 绕过视图解析器的解析
    public List<Books> ajaxAllBook(Model model, HttpServletRequest request) {
        //springmvc便捷之一,return的对象将直接转为json对象传给客户端
        return bookService.queryBooks();
    }

(2)前端(即Ajax)

1.JQuery

(a)方法模板

$.post(url,data,funcation(){});//不止这三个参数



$.post(

projectName + "/book/ajaxAllBook",


{"username":"admin"}.

 function (data) {
                let html = "";声明变量
                for 遍历
                $("#mainBook").html(html);插入去对应的BOM对象中
 }

);

 (b)示例

        function loadBooks() {
            $.post(projectName + "/book/ajaxAllBook", function (data) {
                let html = "";
                for (let i = 0; i < data.length; i++) {
                    html += "<tr>" +
                        "<td>" + data[i].bookID + "</td>" +
                        "<td>" + data[i].bookName + "</td>" +
                        "<td>" + data[i].bookCounts + "</td>" +
                        "<td>" + data[i].detail + "</td>" +
                        "<td>" + "<a href=" + projectName + "/book/toUpdateBook?bookID=" + data[i].bookID + " class=\"btn btn-info\">修改</a>\n" +
                        "&nbsp;|&nbsp;\n" +
                        "<a id=\"deleteBtn\" href=" + projectName + "/book/deleteBook?bookID=" + data[i].bookID + "\" class=\"btn btn-danger\">删除</a>\n" + "</td>" +
                        "<tr>";
                }
                $("#mainBook").html(html);
            })

        }

八、拦截器

(1)java代码

LoginInterceptor.java

package com.gy.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String username = (String) request.getSession().getAttribute("username");

        if ("".equals(username) || username == null) {
            request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response);
            return false;
        }

        return true;
    }
}

(2)配置bean

applicationContext.xml追加

<!--第一个拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--拦截注解数值为RequestMapping("\user\*")的方法,注意是按方法来拦截的!!不拦截任何静态文件-->
            <mvc:mapping path="/user/**"/> 
            <bean class="com.gy.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

(3)被拦截器控制的方法

    @RequestMapping("/user/main")
    public String main(String username, Model model) {
        model.addAttribute("username", username);
        return "user/main";
    }

    @RequestMapping("/user/loginOut")
    public String loginOut(HttpSession session) {
        session.removeAttribute("username");
        return "redirect:/login";
    }
//结论,拦截器是拦截方法的,记住是方法,凡是以/user/开头的方法都会被拦截,因此
    //这就很容易理解了,必须登录才能用到的方法均用user开头即可!!!!!!!!!

九、文件上传与下载

(1)上传

1.前端

<form action="" enctype="multipart/form-data" method="post">
   <input type="file" name="file"/>
   <input type="submit">
</form>

2.后端

1.需要的jar包,上面的pom.xml已导入

<!--文件上传-->
<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>

2.applicationContext.xml配置

    <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
        <property name="maxUploadSize" value="10485760"/>
        <property name="maxInMemorySize" value="40960"/>
    </bean>

3.Controller java代码

 @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException, IOException {

        //生成上传文件的保存路径
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if (!realPath.exists()) {
            realPath.mkdir();
        }
        //上传文件地址
        System.out.println("上传文件保存地址:" + realPath);
        //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
        file.transferTo(new File(path + "/" + file.getOriginalFilename()));

        return "redirect:/index.jsp";
    }

(2)下载

1.后端

 Controller java代码

    @RequestMapping("/download")
    public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //下载的图片地址
        String path = request.getServletContext().getRealPath("/statics/img");
        String fileName = "girl.jpg";

        //1、设置response 响应头
        response.reset(); //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8"); //字符编码
        response.setContentType("multipart/form-data"); //二进制传输数据
        //设置响应头
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));

        File file = new File(path, fileName);
        //2、 读取文件--输入流
        InputStream input = new FileInputStream(file);
        //3、 写出文件--输出流
        OutputStream out = response.getOutputStream();

        byte[] buff = new byte[1024];
        int index = 0;
        //4、执行 写出操作
        while ((index = input.read(buff)) != -1) {
            out.write(buff, 0, index);
            out.flush();
        }
        out.close();
        input.close();
    }

2.前端

访问http://ip:port/项目名/download即可

十、Maven WAR包导出

(1)配置pom.xm

<packaging>war</packaging>

    <dependencies>
.......
<build>
    <!--必须配置如下!!,只有这样在src/main/java的mapper.xml文件才能编译导出,否则在mybatis使用时会出错!!-->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>

        <plugins>
<!--            导出为war包-->
            <!-- war 插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.2</version>
                <configuration>
<!-- war 包名 -->
                    <warName>ssm</warName>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <webResources>
                        <resource>
                            <directory>web</directory>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

        </plugins>
        <!--    必须配置的结束-->
    </build>

(2)打包

(3)使用

 直接复制粘贴到%Tomcat%/webapps下即可启动使用!

猜你喜欢

转载自blog.csdn.net/qq15347747/article/details/120375792