一、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" +
" | \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下即可启动使用!