SpringMVC

1、MVC特点

  1. 轻量级,简单易学
  2. 高效,基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTfu、数据验证、格式化、本地化、主题等

2、搭建环境

必须要是有web.xml的web项目

1、导入jar包

Spring MVC需要的最核心的jar包

  • commons-logging.jar
  • spring-aop.jar
  • spring-beans.jar
  • spring-context.jar
  • spring-core.jar
  • spring-expression.jar
  • spring-web.jar
  • spring-webmvc.jar

2、修改配置文件

  • 在web.xml中配置DispacherServlet,DispacherServlet默认加载/WEB-INF/<servlet-name>-servlet.xml下的Spring配置文件,可以通过contextConfigLocation更改配置文件路径。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <!-- SpringMVC配置文件路径 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 启动时自动加载配置文件 -->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>

3、Spring MVC配置文件

注解

  • 在scr根目录配置Spring MVC自动扫描包的路径

    1
    2
    <!-- 配置Spring MVC自动扫描的路径 -->
    <context:component-scan base-package="com.znsd.controller" />
  • 配置视图解析器,解析方式为

    1
    2
    3
    4
    5
    6
    7
    <!-- 配置视图解析器 将视图返回字符串解析到:/WEB-INF/view/返回值.jsp 下-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 视图前缀 -->
    <property name="prefix" value="/WEB-INF/view/" />
    <!-- 视图后置 -->
    <property name="suffix" value=".jsp" />
    </bean>

    使用接口

    需要在添加俩条

    1
    2
    3
    4
    5
    6
    7
    8
    9
    添加 处理映射器
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    添加 处理器适配器
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    添加请求地址
    <bean id="/url地址" class="实现接口地址"/>
    /url地址是自定义的,

    结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?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.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
    <!--使用注解则扫包-->
    <context:component-scan base-package="controller" />
    <mvc:default-servlet-handler />
    <mvc:annotation-driven />
    <!--使用接口的话-->
    <!--<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
    <!--<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>-->
    <!--<bean id="/hello" class="controller.Hello"/>-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 视图前缀 -->
    <property name="prefix" value="/WEB-INF/view/" />
    <!-- 视图后置 -->
    <property name="suffix" value=".html" />
    </bean>
    </beans>

4、创建请求处理类

使用注解

  • 在src下面添加包controlle,然后在包内添加一个HelloWorld类,使用注解修饰类和方法。

    1
    2
    3
    4
    5
    6
    7
    8
    @Controller // 修饰类为一个控制器
    public class HelloWorld {
    @RequestMapping("/hello") // 修饰方法(或类)的请求路径
    public String hello(){
    System.out.println("hello spring mvc");
    return "hello";//这个为跳转的页面,例welcom.html
    }
    }

使用接口

1
2
3
4
5
6
7
8
9
10
public class Hello implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// TODO Auto-generated method stub
ModelAndView mv = new ModelAndView();
System.out.println("hello spring mvc");
mv.setViewName("welcome");//这个为跳转的页面,例welcom.html
return mv;
}
}

5、创建一个受保护的html

在WEB-INF下面创建一个view内创建一个hello.html(要和上面返回的名字一样),随便在body内输入

访问的地址尽量为${pageContext.request.contextPath}/地址

${pageContext.request.contextPath}为当前项目地址

1
2
3
4
5
6
7
8
9
例:
<form action="${pageContext.request.contextPath}/images" enctype="multipart/form-data" method="post" >
<input type="file" name="file"><br />
<input type="file" name="file"><br />
<input type="file" name="file"><br />
<input type="file" name="file"><br />
<input type="file" name="file"><br />
<input type="submit" value="上传多个文件"> ${error}
</form>

6、启动

在url地址输入处理类的请求路径

访问

然后不是404则成功了

3、执行流程

具体步骤:

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)

第十一步:前端控制器向用户响应结果

4、注解

  1. @Contoller是为了让Spring IOC容器初始化时自动扫描 通常放于类名上

  2. @RequestMapping是为了映射请求路径,通常用于方法上,如果在类上也使用了,那么格式为/类路径/方法路径

    • value为请求地址的值

    • method = RequestMethod.设置请求方式

    • params 值为前台传后台来的参数,基本上为一个,若需要多个大括号分割,几个值,都要对应,否则报错

      1
      2
      3
      4
      5
      6
      7
      8
      9
      例:
      @Controller
      public class guao {
      @RequestMapping(value = "/guao",method = RequestMethod.POST,params = {"sid","id"})
      public String ao(){
      System.out.println("guao");
      return "welcome";
      }
      }
  3. @SessionAttributes(value={“s”})将属性名为s的存入session,通常也放于类名上

  4. @RequestHeader 请求头包含了若干的属性,用来获取客户端的信息

    1
    2
    3
    4
    5
    6
    7
    例:
    public String ao(@RequestHeader("Accept-Language") String language){
    System.out.println(language);
    return "welcome";
    }

    我的最终结果是 zh-CN,zh;q=0.9
  5. @CookieValue:用来获取客户端Cookie信息。

    1
    2
    3
    4
    5
    6
    7
    例:
    public String ao(@CookieValue("Accept-Language") String language){
    System.out.println(language);
    return "welcome";
    }
    注!!!
    此方法我未试,中间的值应该为前台传后台来的Cookie值

5、Restful风格

​ Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计额软件可以更简洁,更有层次,更易于实现缓存等机制

功能

  1. 资源:互联网所有的事务又可以被抽象为资源
  2. 资源操作:使用POST、DELETE、PUT、GET使用不同方法对资源进行操作
  3. 分别对应CRUD

方法级别的注解变体有如下几个: 组合注解

1
2
3
4
5
@GetMapping   比@@RequestMapping更简单,以get防守提交
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

地址上使用参数

1、添加@PathVariable

1
2
3
4
5
6
7
8
例:
@GetMaping("/add/{a}/{b}")
public String test(@PathVariable int a){
System.out.println(a);
return "hello";
}
地址栏最终格式:http://localhost/springMVC/add/12/2
注意:必须要跟参数a和b,否则会报错

2、添加@RequestParam

  • value:指定参数的名称
  • required:指定参数是否为必填
  • defaultValue:指定参数的默认值
1
2
3
4
5
6
7
8
9
10
例:
public class guao {
@RequestMapping(value = "/guao")
public String ao(@RequestParam (value = "id",required = false,defaultValue = "0")int userid){
System.out.println(userid);
return "welcome";
}
}
地址栏最终格式:http://localhost/springMVC/guao
注意:必须要跟@RequestParam中的值,否则会报错

6、实体对象绑定参数

当前台传后台的值的name属性跟属性类的值对应时,会自动绑定

1
2
3
4
5
例:
<form action="guao" method="post">
<input type="text" name="id" value="10">
<input type="submit" value="提交">
</form>
1
2
3
例:Stu.java
private int id;
private String name;
1
2
3
4
5
6
7
8
9
例:
public class guao {
@RequestMapping(value = "/guao")
public String ao(Stu stu){
System.out.println(stu.toString());
return "welcome";
}
}
结果为 Stu [id=10, name=null]

7、Map参数

可以利用Map从后台往前台传数据

1
2
3
4
5
6
7
8
例:
@RequestMapping(value = "/guao")
public String ao(Map<String, Object> map){
map.put("a", "b");
return "welcome";
}+
前台通过el表达式获取
${a}

8、使用Spring表单标签

导入SpringMVC表单标签

1
2
<%@taglib uri="http://www.springframework.org/tags/form" prefix="guao" %> 
prefix的值为自定义的

form标签

1
2
3
4
5
6
例:
<guao:form modelAttribute="stu" action="guao">
<guao:input path="name" />
<input type="submit">
</guao:form>
modelAttribute的值必须要跟后台@ModelAttribute注解的属性名一致,并且只能传一组参数到前台来

java部分

1
2
3
4
5
6
7
8
private StudentServiceImpl studentServiceImpl;
@RequestMapping(value = "/guao")
public String ao(@ModelAttribute("Stu")Stu stu,Model model){
System.out.println(stu);
List<Stu> list = studentServiceImpl.selectAll();
model.addAttribute("stu",list.get(0));
return "welcome";
}

9、表单校验

1、注解

注解 详细信息
@Null 被注解元素值必须为null
@NotNull 被注释的元素值必须不为null
@AssertTrue 被注释的元素值必须为true
@AssertFalse 被注释的元素值必须为false
@Min(value) 备注是的元素值必须为一个数字,其值必须大于等于指定的最小值
@Max 被注释的元素值必须为一个数字,其值必须小于等于指定的最大值
@DecimalMin 被注的元素值必须为一个数字,其值必须大于等于指定的最小值
@DecimalMax 被注释的元素值必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素值必须在指定的范围之内
@Digits(integer,faction) 被注释的元素值是一个数字,必须在可接受的范围之内
@Past 被注释的元素值必须是一个过去的元素
@Future 被注释的元素值必须是一个将来的元素
@Pattern 被注释的元素值必须符合指定的正则表达式

2、使用

  1. 放于属性类中
  2. html或xml中的name属性值必须要跟属性类一一对应
  3. form必须使用Spring表单标签
  4. 属性类前面必须要添加 @Valid 注解才生效
1
2
3
4
5
6
7
8
9
10
例:StudentVO.class
@NotEmpty
private String name;
@Email
private String email;
private int sex;
private String dizhi;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Past
private Date birthday;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
例:student.jsp
<!--jsp的头-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--使用spring form标签-->
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<guao:form action="StudentAdd" method="post" modelAttribute="studentVO">
姓名:<input type="text" name="name"><guao:errors path="name" /><br/>
邮箱:<input type="text" name="email"><guao:errors path="email" /><br/>
性别:<input type="radio" value="1">男
<input type="radio" value="2">女
<guao:errors path="sex" /><br/>
地址:<input type="text" name="dizhi"><guao:errors path="dizhi" /><br/>
<生日:<input type="text" name="birthday"><guao:errors path="birthday" /><br/>
<input type="submit" value="提交">
</guao:form>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
例:Student.java
@RequestMapping("/StudentAdd")
public String StudentAdd(@Valid StudentVO stu,BindingResult result) {
System.out.println(stu);
<!--查看错误开始-->
if (result.getFieldErrorCount()>0) {
System.out.println(1111);
List<FieldError> fieldError= result.getFieldErrors();
for (FieldError error : fieldError) {
System.out.println(error.getField()+"==="+error.getDefaultMessage());
}
return "StudentAdd";
}
<!--查看错误结束-->
return "StudentList";
}

自定义错误信息

格式:注解.属性类.属性=值

properties会自动转换为Unicode

当类型匹配不成功时

格式:typeMismatch.属性类.属性=值

1
2
3
例:i18n.properties
NotEmpty.studentVO.name=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
typeMismatch.studentVO.birthday=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u65F6\u95F4\u683C\u5F0F

在springmvc.xml中插入

1
2
3
4
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
<!--这里的value值为上面的i18n.properties的文件名,可以更换-->
</bean>

10、解决乱码

image-20210504212618899

在web.xml中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

11、实现页面语言切换

中文创建:i18n_zh_CN.properties

1
2
3
4
5
6
例:
studentVO.name=\u59D3\u540D
studentVO.email=\u90AE\u7BB1
studentVO.sex=\u6027\u522B
studentVO.dizhi=\u5730\u5740
studentVO.birthday=\u51FA\u751F\u65E5\u671F

英文创建:i18n_en_US.properties

1
2
3
4
5
6
例:
studentVO.name=name{0}
studentVO.email=email
studentVO.sex=sex
studentVO.dizhi=dizhi
studentVO.birthday=birthday

在Springmvc.xml中添加

1
2
3
4
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>

在html或jsp头部添加

1
2
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<prefix的值可以自定义,这里是什么,下面操作的时候就是什么>

调用

1
2
3
4
5
<spring:message code="studentVO.name"/><input type="text" name="name"><guao:errors path="name" /><br/>
<spring:message code="studentVO.email"/><input type="text" name="email"><guao:errors path="email" /><br/>
<spring:message code="studentVO.sex"/><input type="radio" value="1">
<input type="radio" value="2">

在jsp或html中添加切换

1
2
3
<a href="StudentAdd?locale=zh_CN">中文</a>    
<a href="StudentAdd?locale=en_US">English</a>
StudentAdd为您当前页面地址

12、文件上传(重点)

第一步:导入架包

  • commons-fileupload-1.3.3.jar
  • commons-io-2.6.jar

下载地址

FileUpload – Download Apache Commons FileUpload

Commons IO – Download Apache Commons IO

第二步:在springmvc.xml中添加

1
2
3
4
5
6
7
<!-- 配置文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置编码格式 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 设置上传的最大大小,单位字节(Byte) -->
<property name="maxUploadSize" value="102400000"></property>
</bean>

1、form表单文件上传

第三步:在html或jsp中,文件上传格式

1
2
3
4
<form action="${pageContext.request.contextPath}/image" enctype="multipart/form-data" method="post" > 
<input type="file" name="file">
<input type="submit" value="上传文件">
</form>

第四步:将上传文件添加到文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public String image(@RequestParam("file") MultipartFile file,HttpServletRequest req,Map<String, Object> map) {
//获取上传文件名
String fileName=file.getOriginalFilename();
if (fileName!="") {
//获取当前项目地址(但我获取到的是服务器当前项目地址)
String paxh= req.getServletContext().getRealPath("/image");
//创建一个file检验一下是否存在image这个目录,不存在则创建一个
File f=new File(paxh);
if (!f.exists()) {
f.mkdir();
}
//获取文件格式
String format=fileName.substring(fileName.lastIndexOf("."));
//生成一个随机的文件名
String randomName=UUID.randomUUID().toString();
//将随机文件名跟格式合并,形成一个新文件名
String newName=randomName+format;
try {
//将图片写入指定路径
file.transferTo(new File(paxh+"/"+newName));
} catch (IllegalStateException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
map.put("images", "/image/"+newName);
}
else {
map.put("error", "请选择上传图片");
return "StudentList";
}

return "image";
}

若需要上传多张图片,则把参数MultipartFile该为数组 MultipartFile[],然后其他的根上传单个一样

2、ajax文件上传

第三步、导入需要的js架包

  • ajaxfileupload.js
  • jquery.js

13、拦截器

拦截器,我们通常用于权限控制

1、自定义拦截器

自定义拦截器必须要实现接口HandlerInterceptor 里面包含三个方法

  • preHandle 进入目标方法之前执行
  • postHandle 目标方法执行后执行
  • afterCompletion 渲染页面之后执行

当preHandle()返回值为false时,postHandle (),afterCompletion()这俩个方法则不执行

如果有多个拦截器,其他有一个的preHandle()为false,则运行该前面拦截器的所有afterCompletion()方法(不包括为false拦截器的afterCompletion()方法),然后结束运行

2、拦截器的使用

第一步,在springweb.xml配置

1
2
3
4
5
6
7
8
9
10
11
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截什么 -->
<mvc:mapping path="/guao/*"/>
<!-- 不拦截什么 -->
<mvc:exclude-mapping path="/User/Log"/>
<!--拦截后进入那个类-->
<bean class="interceptor.UserInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

第二步,配置拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class UserInterceptor implements HandlerInterceptor{

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
UserVO vo= (UserVO) request.getSession().getAttribute("userSession");
System.out.println(vo);
if (vo==null) {
request.setAttribute("userError", "请重新登录");
request.getRequestDispatcher("/guao/index").forward(request, response);
return false;
}
return true;
}
}

14、异常配置

1、配置当前类异常处理

在一个方法上添加注解@ExceptionHandler(),且这个方法的参数只能存在Exception (我暂时这么理解,因为添加其他参数,注解失效)

1
2
3
4
5
@ExceptionHandler()
public String Error(Exception ex) {
System.out.println("Exception"+ ex);
return "404";
}

也可以指定是什么异常进入,在括号中添加异常.class即可,若需要指定多个异常则大括号内异常.class逗号隔开

若需要往异常页面传异常或值,则需要new一个modelAndView,括号内的值则是你要跳转的页面,然后将放回类型该为ModelAndView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
例:单个
@ExceptionHandler(NullPointerException.class)
public ModelAndView Error(Exception ex) {
ModelAndView view=new ModelAndView("404");
view.addObject("ex", ex);
System.out.println("Exception-------"+ ex);
return view;
}

例:多个
@ExceptionHandler({ArithmeticException.class,NullPointerException.class})
public ModelAndView Error(Exception ex) {
ModelAndView view=new ModelAndView("404");
view.addObject("ex", ex);
System.out.println("Exception-------"+ ex);
return view;
}

2、配置全局异常处理

1、SimpleMappingExceptionResolver实现异常处理

通过配置springMVC.xml来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- -->
<property name="exceptionAttribute" value="ex"></property>
<property name="exceptionMappings">
<props>
<!--
k一定要异常的全类名(也可以是自定义异常)。
prop之间的值,则是跳转的页面
表示出现MyException异常,就跳转到404.jsp视图
-->
<prop key="java.lang.NullPointerException">404</prop>
</props>
</property>
</bean>

2、@ExceptionHandler注解实现异常处理

1
2
3
4
5
6
7
8
@ControllerAdvice
public class SpringMVCExecption {
@ExceptionHandler()
public String error(Exception ex) {
System.out.println("SpringMVCExecption------->"+ex);
return "404";
}
}

也可以指定是什么异常进入,在括号中添加异常.class即可,若需要指定多个异常则大括号内异常.class逗号隔开

注意!!!记得扫包

1
例:@ExceptionHandler({)

3、HandlerExceptionResolver 接口自定义异常处理器

1
2
3
4
5
6
7
8
9
10
public class SpringMVCExecption2 implements HandlerExceptionResolver  {
@Override
public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
Exception ex) {
ModelAndView model =new ModelAndView("404");
model.addObject("ex",ex);
System.out.println("SpringMVCExecption------->"+ex);
return model;
}
}

还需要去springMVC中挂载这个类才生效

15、JSON

1、导入架包

  • jackson-annotations-2.8.0.jar
  • jackson-core-2.8.0.jar
  • jackson-databind-2.8.0.jar

2、在方法前添加@ResponseBody注解

@ResponseBody注解则不会跳页面,适合ajax请求,返回什么,前台则收到什么

3、形成数据

这个我配合后面的属性类一起使用,若想形成下面效果,则返回List格式即可

1
2
3
4
5
6
7
8
9
10
11
例:
@ResponseBody
@RequestMapping("/json")
public JsonStructure<List<UserVO>> listJson() {
List<UserVO> list=new ArrayList<UserVO>();
list.add(new UserVO("张三","123"));
list.add(new UserVO("李四","1234"));
list.add(new UserVO("王五","12345"));
list.add(new UserVO("赵六","123456"));
return JsonStructure.Ok(list);
}

这个形成的数据为json的date数据

json

则我们需要配置一个完整的json格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
例:JsonStructure.java

public class JsonStructure<T> implements Serializable{
private static final long serialVersionUID = 1L;

private Integer code;
private String msg;
private T date;

private static final Integer OK=0;

public JsonStructure() {
}
public JsonStructure(Integer code, String msg, T date) {
this.code = code;
this.msg = msg;
this.date = date;
}

public static<T> JsonStructure<T> Ok(T t){

return new JsonStructure<T>(OK,"成功",t);
}
}

16、404错误跳转页面

当有时候用户在url地址框随便输入的时候,我们不可能给用户看404的报错页面,所以我们应该调到一个专属404报错的页面,方便用户体验

1
2
3
4
5
6
<error-page>
<!--错误编码-->
<error-code>404</error-code>
<!--跳转的网页-->
<location>/pageNotFound</location>
</error-page>

17、文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping("/doweFile")
public ResponseEntity<byte[]> doweFile(HttpServletRequest req) {
//选中webContent下的file/xxx.txt
//InputStream webContent = req.getServletContext().getResourceAsStream("/file/xxx.txt");
//选中src下的i18n.properties
InputStream webContent = FileUpload.class.getClassLoader().getResourceAsStream("i18n.properties");
ResponseEntity<byte[]> entity=null;
try {
byte[] file = FileCopyUtils.copyToByteArray(webContent);
HttpHeaders header = new HttpHeaders();
//filename=xxxx.txt 这个则是下载后的名字与格式
header.add("Content-Disposition", "attachment;filename=xxxx.txt");
entity = new ResponseEntity<byte[]>(file, header, HttpStatus.OK);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return entity;
}

18、整合SSM

1、导入架包

架包

2、配置web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!-- 配置springMVC -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- SpringMVC配置文件路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 启动时自动加载配置文件 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 解决乱码问题 -->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 报404错误虎跳转页面 -->
<error-page>
<error-code>404</error-code>
<location>/404</location>
</error-page>

<!-- 配置spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3、配置springmvc.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="controller,exception" />

<!-- 可以使用html格式 -->
<mvc:default-servlet-handler />
<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/view/" />
<!-- 视图后置 -->
<property name="suffix" value=".jsp" />
</bean>

<!-- 用于自定义设置错误提示 -->
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>

<!-- 设置语言转换 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>

<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截什么 -->
<mvc:mapping path="/guao/*"/>
<!-- 不拦截什么 -->
<mvc:exclude-mapping path="/User/Log"/>
<mvc:exclude-mapping path="login"/>
<bean class="interceptor.UserInterceptor"></bean>
</mvc:interceptor>
<!-- <bean class="interceptor.OneInterceptor"></bean>
<bean class="interceptor.TwoInterceptor"></bean>
<bean class="interceptor.ThreeInterceptor"></bean> -->
</mvc:interceptors>

<!-- 配置文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置编码格式 -->
<property name="defaultEncoding" value="UTF-8" />
<!-- 设置上传的最大大小,单位字节(Byte) -->
<property name="maxUploadSize" value="102400000"></property>
</bean>

<!-- 配置使用SimpleMappingExceptionResolver来映射异常 -->
<!-- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
给异常一个别名,可以根据别名在前台输出
<property name="exceptionAttribute" value="ex"></property>
<property name="exceptionMappings">
<props>
一定要异常的全类名(也可以是自定义异常)。 表示出现MyException异常,就跳转到error.jsp视图
<prop key="java.lang.NullPointerException">404</prop>
<prop key="java.lang.ArithmeticException">404</prop>
</props>
</property>
</bean> -->
<bean class="exception.SpringMVCExecption2" />
</beans>

SSM整合springmvc的配置可以不需要这么多,有些可以删

4、配置mybatis核心配置文件

mybatis核心配置文件也可以不用配置,主要用于配置别名于log4j

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>

5、配置spring配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 导入外部properties文件 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 连接数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/article" />
<property name="username" value="root" />
<property name="password" value="123456" />
</bean>

<!-- 扫描xml,配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
<property name="configLocation" value="classpath:mybatis.xml" />
</bean>

<!-- dao层 扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描dao层 -->
<property name="basePackage" value="dao"></property>
<!-- 识别dao层接口的Repository注解 -->
<property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
<!-- 注入SqlSessionFactoryBean -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

<!-- 事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 启用注解式事务配置-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

<!-- 开启注解支持 -->
<context:annotation-config />

<!-- 扫描包 -->
<context:component-scan base-package="service,dao"/>
</beans>

6、配置mapper的xml

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.User.UserDao">
<select id="UserAll" resultType="vo.UserVO">
select * from user
</select>
</mapper>

7、配置dao层

1
2
3
4
5
6
例:UserDao.java
@Repository
public interface UserDao {
public List<UserVO> UserAll();
}

8、配置接口跟实现类

1
2
3
4
例:UserService.java
public interface UserService {
public List<UserVO> UserAll();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
例:UserServiceimpl.java
@Service
public class UserServiceimpl implements UserService{
@Resource
private UserDao UserDao;

@Override
public List<UserVO> UserAll() {
// TODO Auto-generated method stub
return this.UserDao.UserAll();
}

}

9、使用

1
2
3
4
5
6
@ResponseBody
@RequestMapping("/json")
public JsonStructure<List<UserVO>> listJson() {
List<UserVO> list = service.UserAll();
return JsonStructure.Ok(list);
}