SpringMVC学习

简介

springMVC就是类似于Struts2的mvc框架,属于SpringFrameWork的后续产品。

 

springMVC的优点

SpringMVC与Struts2区别
对比项目SrpingMVCStruts2优势
国内市场情况有大量用户,一般新项目启动都会选用springmvc有部分老用户,老项目组,由于习惯了,一直在使用。国内情况,springmvc的使用率已经超过Struts2
框架入口基于servlet基于filter本质上没太大优势之分,只是配置方式不一样
框架设计思想控制器基于方法级别的拦截,处理器设计为单实例控制器基于类级别的拦截, 处理器设计为多实例由于设计本身原因,造成了Struts2,通常来讲只能设计为多实例模式,相比于springmvc设计为单实例模式,Struts2会消耗更多的服务器内存。
参数传递参数通过方法入参传递参数通过类的成员变量传递Struts2通过成员变量传递参数,导致了参数线程不安全,有可能引发并发的问题。
与spring整合与spring同一家公司,可以与spring无缝整合需要整合包Springmvc可以更轻松与spring整合

 

 

springmvc.xml核心配置文件

<?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:p="http://www.springframework.org/schema/p"

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-4.0.xsd

        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

 

<!-- 配置@Controller处理器,包扫描器 -->

<context:component-scan base-package="com.itheima.springmvc.controller" />

</beans>

 

web.xml中配置前端控制器

<!-- 配置前端控制器 -->

  <servlet>

    <servlet-name>springmvc</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 加载springmvc核心配置文件 -->

    <init-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath:springmvc.xml</param-value>

    </init-param>

  </servlet>

  <!-- 配置拦截路径 -->

  <servlet-mapping>

    <servlet-name>springmvc</servlet-name>

    <url-pattern>*.action</url-pattern>

  </servlet-mapping>

 

 

SpringMVC架构

 

1、框架默认加载组件

jar包下的DispatcherServlet,properties 

 

2、处理器映射器

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

<!-- 配置处理器映射器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

 

 3、处理器适配器

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

<!-- 处理器适配器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

 

4、注意

映射器与适配器必需配套使用,如果映射器使用了推荐的RequestMappingHandlerMapping,适配器也必需使用推荐的RequestMappingHandlerAdapter。

 

5、注解驱动

<!-- 注解驱动配置,代替映射器与适配器的单独配置,同时支持json响应(推荐使用) -->

<mvc:annotation-driven />

 

视图解析器

<!-- 配置视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!-- 配置视图响应的前缀 -->

<property name="prefix" value="/WEB-INF/jsp/" />

<!-- 配置视图响应的后缀 -->

<property name="suffix" value=".jsp" />

</bean>

 

总结-springMVC架构

 

 

 

 参数绑定

 

 1、 默认支持的参数类型

基于完成需求:点击修改商品时,打开商品编辑页面,展示商品信息

例子:

@RequestMapping("itemEdit")

public ModelAndView itemEdit(HttpServletRequest request,HttpServletResponse response,HttpSession session){

ModelAndView mav = new ModelAndView();

//request获取参数

String id = request.getParameter("id");

System.out.println("id为:" + id);

//其它对象输出

System.out.println("response对象:" + response);

System.out.println("session对象:" + session);

//查询商品信息

Item item = itemServices.getItemById(new Integer(id));

//设置商品数据返回页面

mav.addObject("item", item);

//设置视图名称

mav.setViewName("itemEdit");

return mav;

}

 

2、绑定简单参数

value:传入的参数名,required:是否必填,defaultValue:默认值

例子:

@RequestMapping("itemEdit")

public ModelAndView itemEdit(@RequestParam(value="id",required=true,defaultValue="1")Integer ids){

ModelAndView mav = new ModelAndView();

//查询商品信息

Item item = itemServices.getItemById(ids);

//设置商品数据返回页面

mav.addObject("item", item);

//设置视图名称

mav.setViewName("itemEdit");

return mav;

}

 

3、Model/ModelMap

例子:

@RequestMapping("itemEdit")

public String itemEdit(@RequestParam("id")Integer ids,Model m,ModelMap model){

//查询商品信息

Item item = itemServices.getItemById(ids);

//通过Model把商品数据返回页面

model.addAttribute("item", item);

//返回String视图名字

return "itemEdit";

}

 

4、绑定pojo对象

注意:表单提交的name属性必需与pojo的属性名称一致。

例子:

@RequestMapping("updateItem")

public String updateItem(Item item,Model model){

//更新商品

itemServices.update(item);

//返回商品模型

model.addAttribute("item", item);

//返回担任提示

model.addAttribute("msg", "修改商品成功");

//返回修改商品页面

return "itemEdit";

}

 

5、绑定包装的pojo

要点:页面通过点(.)传递属性。

 

6、数组类型的参数绑定

例子:

@RequestMapping("queryItem")

public String queryItem(QueryVo vo, Integer[] ids) {

System.out.println(vo);

//输出传入的数组

if (ids != null && ids.length > 0) {

for (Integer id : ids) {

System.out.println("传入的商品列表分别为:" + id);

}

}

return "itemList";

}

 

7、List类型的绑定

例子:基于批量修改商品操作完成参数传递。

Jsp修改

控制器修改

  

POJO修改

 

 

 @RequestMapping注解的使用

1、路径映射可以是数组

2、@RequestMapping可以加在类头部,用于目录分级管理 

3、限定请求方法

 

 Controller方法返回值

1、返回ModelAndView

2、返回void

request

response 

3、返回String

返回视图名字

redirect与forward

 

 Springmvc中异常处理

思想:做一个全局异常处理器,处理所有没有处理过的运行时异常用于更友好地提示用户。

 

1、创建全局异常处理器

public class CustomerException implements HandlerExceptionResolver {

@Override

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,

Exception e) {

//记录日志

e.printStackTrace();

//错误消息

String msg = "很抱歉,系统发生异常了,请联系管理员";

//响应用户错误提示

ModelAndView mav = new ModelAndView();

//返回错误消息

mav.addObject("msg", msg);

//响应错误提示页面

mav.setViewName("msg");

return mav;

}

}

 

2、配置异常处理器

 

 

 

3、自定义异常 

例子:

 

1、新建自定义异常类

public class MyException extends Exception {

//错误消息

private String msg;

public MyException() {

super();

}

public MyException(String msg) {

super();

this.msg = msg;

}

public String getMsg() {

return msg;

}

public void setMsg(String msg) {

this.msg = msg;

}

}

 

2、修改异常处理器,加上异常判断

 

 

 

图片上传处理

 

1、配置虚拟目录

 

 

2、加入上传功能需要的jar包

 

3、配置多媒体解析器

<!-- 配置多媒体处理器 -->

<!-- 注意:这里id必须填写:multipartResolver -->

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- 最大上传文件大小 -->

<property name="maxUploadSize" value="8388608" />

</bean>

 

4 、jsp修改

 

 

5、 编写图片上传处理代码

//图片上传用MultipartFile接收文件

@RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET })

public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception {

// 图片新名字

String name = UUID.randomUUID().toString();

// 图片原名字

String oldName = picFile.getOriginalFilename();

// 后缀名

String exeName = oldName.substring(oldName.lastIndexOf("."));

File pic = new File("D:\\WebWork\\" + name + exeName);

// 保存图片到本地磁盘

picFile.transferTo(pic); 

// 更新商品图片信息

item.setPic(name + exeName);

itemServices.update(item);

model.addAttribute("item", item);

model.addAttribute("msg", "修改商品成功");

return "itemEdit";

}

 

 json数据交互

1、加入jar

2、编码

@RequestMapping("getItem")

//@ResponseBody把pojo转成json串响应用户

@ResponseBody

//@RequestBody用于接收用户传入json串转成pojo

public Item getItem(@RequestBody Item item2) { 

System.out.println("接收到的json商品数据为:" + item2);

Item item = itemServices.getItemById(3);

return item;

}

 

Springmvc实现Restful

编码

//RESTful风格url上的参数通过{}点位符绑定

//点位符参数名与方法参数名不一致时,通过@PathVariable绑定

@RequestMapping("/item/{id}")

public String testRest(@PathVariable("id") Integer ids, Model model) {

Item item = itemServices.getItemById(ids);

model.addAttribute("item", item);

return "itemEdit";

}

 

自定义拦截器

拦截器开发流程

1、创建

 

一号拦截器

public class MyInterceptor1 implements HandlerInterceptor {

//在Controller方法执行后被执行

//处理异常、记录日志

@Override

public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

throws Exception {

System.out.println("MyInterceptor1.afterCompletion.....");

}

//在Controller方法执行后,返回ModelAndView之前被执行

//设置或者清理页面共用参数等等

@Override

public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

throws Exception {

System.out.println("MyInterceptor1.postHandle.....");

}

//在Controller方法执行前被执行

//登录拦截、权限认证等等

@Override

public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

System.out.println("MyInterceptor1.preHandle.....");

//返回true放行,false拦截

return true;

}

 

二号拦截器,修改打印信息。

 

2 、配置拦截器

<!-- 拦截器定义 -->

<mvc:interceptors>

<!-- 定义一个拦截器 -->

<mvc:interceptor>

<!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->

 

<mvc:mapping path="/**"/>

<bean class="com.itheima.springmvc.interceptor.MyInterceptor1" />

</mvc:interceptor>

 

<mvc:interceptor>

<mvc:mapping path="/**"/>

<bean class="com.itheima.springmvc.interceptor.MyInterceptor2" />

</mvc:interceptor>

 

</mvc:interceptors>

转载于:https://www.cnblogs.com/kyuusan/p/11048498.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值