Spirng-MVC入门
文件上传
文件上传三步骤
1.页面要素
1.Post提交方式
2.file文件上传域
3.enctype属性:必须设置为multipart/form-data
<h2>单文件上传</h2>
<form action="/upload/fileUpload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="name"><br>
文件:<input type="file" name="uploadFiles"><br/>
<input type="submit" value="点击上传">
</form>
2.导入jar包
commons fileupload
commns io
<!--引入文件上传必须依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.配置文件
<!-- 配置文件上传解析器
id="multipartResolver" 文件上传解析器id的值必须等于multipartResolver,如果配置不对进会报错
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 最大允许上传大小5MB -->
<property name="maxUploadSize" value="5242880" />
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
后台代码
应当先判断是否有文件夹,没有则新建文件夹再transferTo
这里要拿到文件的后缀,不然上传的文件没有文件类型。
@RequestMapping(value = "/fileUpload",method = RequestMethod.POST)
@ResponseBody
public Map<String,String> singleupload(String username, MultipartFile[] uploadFiles) throws IOException {
Map<String,String> map=new HashMap<>();
System.out.println(uploadFiles);
if (uploadFiles.length == 0) {
System.out.println("12312");
}
for (MultipartFile uploadFile : uploadFiles) {
/*获取原始文件名*/
System.out.println(uploadFile);
String originalFilename = uploadFile.getOriginalFilename();
String originalFilename = uploadFile.getOriginalFilename();
String[] split = originalFilename.split(".");
System.out.println(username);
File file = new File(BASE_PATH);
if (!file.exists()) {
file.mkdirs();//创建文件目录
}
/*保存到服务器上这里是本地*/
uploadFile.transferTo(new File(BASE_PATH + username+split [1]));
}
map.put("code","200");
map.put("msg","success");
return map;
}
}
前台代码
<h2>单文件上传</h2>
<form action="/upload/fileUpload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="name"><br>
文件:<input type="file" name="uploadFiles"><br/>
<input type="submit" value="点击上传">
</form>
测试
Spring-MVC统一异常处理
1.针对某个类@Exception
标注在方法上,告诉这个异常处理方法
@ExceptionHandler
public ModelAndView handlerException(Exception e){
ModelAndView mv = new ModelAndView();
mv.setViewName("/error/500");
mv.addObject("exception","错误信息:"+e.getMessage());
return mv;
}
编写页面
测试
2,全局针对全局的Excption处理类
继承handlerExceptionResovler类,重写resolverException方法
@Component
public class GoalExcption implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
if (e instanceof RuntimeException){
mv.setViewName("/error/500");
}else if (e instanceof Exception){
mv.setViewName("错误页面地址");
}
mv.addObject("exception","错误信息:"+e.getMessage());
return mv;
}
}
中间用instanceof判断属于哪一个继承判断错误,设置错误信息
3.@AdviceGoalExcption+@ExceptionHandler(继承Exception的类对象)+@ResponseStatus(报错码)
@AdviceGoalExcption告诉spirng这个类需要进行管理
@ExceptionHandler(继承Exception的类对象) 设置什么类型的报错进入
@ResponseStatus(报错码) 设置报错码进入
@ControllerAdvice
public class AdviceGoalExcption {
//内部错误
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView inClassExcption(Exception e){
ModelAndView mv = new ModelAndView("/error/500");
mv.addObject("exception","错误信息:"+e.getMessage());
return mv;
}
}
4.在web.xml中设置报错页
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/error/500.jsp</location>
</error-page>
拦截器
继承HandlerInterceptor方法
继承HandlerInterceptor重写3个方法
- preHandle 方法最先执行
- postHandle 中间执行
- afterCompletion 最后执行
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView){
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("afterCompletion");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
}
Bean加载配置文件加载拦截器类
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="org.example.aop.MyHandlerInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
mvc:mapping path="/**" 设置拦截的路径,这里是所有的都拦截
bean class =“类路径” 加载类
测试 it’s OK!
拦截器可以做登录的只要返回false就可以不继续往下继续下去。验证没有登录或者登录页面就返回false。登录了就返回true继续下去
FreeMark多视图控制器
配置pom.xml文件
引入支持包spring-context-support
<!--使用FreeMarker必须引入这个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<!--只提供访问项目打包不包含该依赖-->
<scope>provided</scope>
</dependency>
配置Web.xml DispatcherServlet分发器
<!--配置FreeMark的Servlet分发器-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Bean文件加载配置文件路径spring-mvc.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置Bean文件加载配置文件.XML
<!-- 定义BeanNameViewResolver 可以用来提供自定义view输出,如pdf等,但是一般用类似千牛
的DNS静态服务来代替
此处与freemarker无关,仅仅是介绍freemarker在多视图解析器下order的顺序
-->
<!--/配置视图解析器【Freemarker】///-->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- ftl模版文件路径 -->
<property name="templateLoaderPath" value="/WEB-INF/views/"></property>
<!-- 页面编码 -->
<property name="defaultEncoding" value="utf-8" />
<property name="freemarkerSettings">
<props>
<!-- 模版缓存刷新时间,不写单位默认为秒 -->
<prop key="template_update_delay">0</prop>
<!-- 时区 和 时间格式化 -->
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<!-- 数字使用.来分隔 -->
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>
<!-- 注册freemarker视图解析器 -->
<bean id="freeMarkerViewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!-- 视图解析顺序,排在其他视图解析器之后 数字越大优先级越低 -->
<property name="order" value="2" />
<!-- 开启模版缓存 -->
<property name="cache" value="true" />
<!-- 上面已经配了,这里就不用配啦 -->
<property name="prefix" value="" />
<!-- 配置文件后缀 -->
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8" />
<!-- 是否允许session属性覆盖模型数据,默认false -->
<property name="allowSessionOverride" value="false" />
<!-- 是否允许request属性覆盖模型数据,默认false -->
<property name="allowRequestOverride" value="false" />
<!-- 开启spring提供的宏帮助(macro) -->
<property name="exposeSpringMacroHelpers" value="true" />
<!-- 添加request attributes属性到ModelAndView中 -->
<property name="exposeRequestAttributes" value="true" />
<!-- 添加session attributes属性到ModelAndView中 -->
<property name="exposeSessionAttributes" value="true" />
</bean>
<context:component-scan base-package="org.example"></context:component-scan>
<!-- 开启spring注解支持 -->
<mvc:annotation-driven/>
后端代码
@Component
@RequestMapping(value = "/user")
public class UserController {
public UserController(){
System.out.println("user");
}
@RequestMapping(value = "/infofreemark")
public String testFreemarker(HttpServletRequest request, ModelMap modelMap)
throws Exception {
User user = new User("may", "21");
List<String> list = new ArrayList<String>();
list.add("Jack1");
list.add("Jack2");
list.add("Jack3");
modelMap.addAttribute("list", list);
modelMap.addAttribute("user", user);
request.setAttribute("haha","哈哈");
return "userinfo";
}
@RequestMapping(value = "/infothymeleaf")
public String testthymeleaf(HttpServletRequest request, ModelMap modelMap)
throws Exception {
User user = new User("may", "21");
List<String> list = new ArrayList<String>();
list.add("Jack1");
list.add("Jack2");
list.add("Jack3");
modelMap.addAttribute("list", list);
modelMap.addAttribute("user", user);
request.setAttribute("haha","哈哈");
return "userinfo-thymeleaf";
}
}
前端代码
<!DOCTYPE HTML>
<html>
<head>
<meta content="text/html" charset="UTF-8" />
<title>Freemarker模板</title>
</head>
<body>
List:<br/>
<#list list as item >
<p style="color: red">${item}</p>
</#list>
User:<br/>
${user.id}-${user.name}--->${user.age}<br/>
request:<br/>
${haha}
</body>
</html>
测试 it’s OK
Thymeleaf多视图控制器
配置POM.XML
<thymeleaf-spring.verson>3.0.5.M3</thymeleaf-spring.verson>
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>${thymeleaf-spring.verson}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>${thymeleaf.version}</version>
</dependency>
</dependencies>
配置WEB.XML DispatcherServlet分发器
<!--配置FreeMark的Servlet分发器-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--<param-value>classpath:spring-mvc.xml</param-value>-->
<!--<param-value>classpath:spring-mvc-freemark.xml</param-value>-->
<param-value>classpath:spring-mvc-Thymeleaf.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置thymeleaf.XML文件
<context:component-scan base-package="org.example.mvc.controller"/>
<!-- 开启spring注解支持 -->
<mvc:annotation-driven/>
<!--thymeleaf模板解析器-->
<bean id="SpringResourceTemplateResolver"
class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".html"></property>
<property name="templateMode" value="HTML5"></property>
<property name="cacheable" value="false"></property>
<property name="characterEncoding" value="UTF-8"></property>
</bean>
<bean id="SpringTemplateEngine"
class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver" ref="SpringResourceTemplateResolver">
</property>
</bean>
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="templateEngine" ref="SpringTemplateEngine"></property>
<property name="characterEncoding" value="UTF-8"></property>
</bean>
前端代码
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Thymeleaf模板引擎-1</title>
</head>
<body>
<div th:each="item:${list}">
<p style="color: red" th:text="${item}" />
</div>
<hr>
User:<br/>
id:<span th:text="${user.id}" /><br/>
name:<span th:text="${user.name}" /><br/>
age:<span th:text="${user.age}" /><br/>
<hr>
haha:<label th:text="${haha}" />
<hr>
<!--http://localhost:8080/list?uid=10101-->
<a href="index.html" th:href="@{http://localhost:8080/list(uid=${user.id})}">测试</a>
</body>
</html>
测试 It’s OK
代码
百度云地址:https://pan.baidu.com/s/1Yp7wl_wG1s2y4GKKYtCe3w
password: k614