首页 > 代码库 > springmvc

springmvc

1.Springmvc的基础知识

1、什么是springmvc

是一个类似于struts2的一个前端web框架。

2、springmvc的框架结构

技术分享

a) 请求先到前端控制器是一个ServletDispatcherServlet)并不处理请求。接收请求,并负责整个处理的流程

b) 到处理器映射器中查找handler处理映射器根据url查找对应的handler。返回HandlerExecutionChain,包含拦截器及handler

c) 根据不同的handler选择不同的处理器适配器。执行handler

d) Handler的功能。处理用户请求返回ModelAndView对象。ModelAndView中包含处理后的数据及逻辑视图名。

e) 根据逻辑视图名转换成物理视图,需要视图解析器。逻辑视图就是一个字符串,物理视图就是jsp的完整路径。

f) 视图可以有多种类型,常用的就是jspfreemakerpdfexcel

3、参数绑定

a) Springmvc默认支持的参数类型

  1. HttpServletRequest
  2. HttpServletResponse
  3. HttpSession
  4. ModelModelMap

b) 简单数据类型的绑定

  1. IntegerStringFloatDouble
  2. 要求请求的参数名称和方法的形参要一致
  3. 如果名称不一致时可以使用@RequestParam注解。

c) 使用pojo类型进行参数绑定。

要求请求的参数名称要和pojo对象的属性名称要一致。

4、@RequestMapping

把请求url和对应处理此urlhandler进行绑定。Handler就是一个处理方法。

可以指定请求方法,可以GETPOST。如果不指定默认都支持。

 

2.springmvc常用注解

@Controller

@service

@repository

@RequestMapping()

@Autowired

@Pathviriable

@RequestParam

@ReponseBody

@CookieValue

@SessionAttributes

@ModelAttribute

@Controller  
@RequestMapping("/user/")  
public class RelativePathUriTemplateController {  
  //@Autowired默认通过属性类型注入by type(UserService),spring支持
  @Autowired
  @Qualifier("userService")
  private UserService userService;

  //@Resource默认通过名称注入by name(userService2),一个借口多个实现类推荐这种写法.J2EE提供
  @Resource
  private UserService userService2;
  @RequestMapping(value=http://www.mamicode.com/"/showAllUser/{userId}", method=RequestMethod.POST) 
  public void showAllUser(HttpServletRequest request,
                HttpServletResponse reponse,
                HttpSession session,
                @PathVariable String userId,
                @RequestParam(value=http://www.mamicode.com/"username", required=false) String username
                Model model) {
   }



}

 

3.Validator自定义校验器(略)

 

 

4.全局异常处理

1.1 处理思路

Springmvc中提供了一个全局异常处理接口HandlerExceptionResolver接口。只需要实现此接口,然后在springmvc的配置文件中配置即可。整个系统只有一个生效。

可以自定义一个异常,把所有的异常都包装起来。

1、自己抛出的异常

2、系统运行时异常。

1.2 处理的步骤

第一步:创建一个全局异常处理类,实现HandlerExceptionResolver。

1、判断此异常是否是自定义异常

2、如果自定义的可以把错误消息取出来

3、如果是运行时异常,把错误堆栈取出来。

4、给用户显示一个错误页面,把错误消息显示出来。如果没有错误消息可以显示网络异常,请重试。

第二步:在springmvc.xml配置全局异常处理类。

/**
 * 自定义异常
 * <p>Title: CustomerException</p>
 * <p>Description: </p>*/

public class CustomerException extends Exception {

    public CustomerException() {
        super();
    }
    
    private String msg;
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}
/**
 * 全局异常处理器
 * <p>Title: GlobalExceptionResolver</p>
 * <p>Description: </p>*/
public class GlobalExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
        
        ex.printStackTrace();
        //错误消息
        String message = null;
        //判断异常是否是自定义的异常
        if (ex instanceof CustomerException) {
            //取自定义消息
            message = ((CustomerException)ex).getMsg();
        } else {
            //系统运行时异常
            //取堆栈的信息
            StringWriter stringWriter = new StringWriter();
            PrintWriter s = new PrintWriter(stringWriter);
            ex.printStackTrace(s);
            message = stringWriter.toString();
        }
        //使用ModelAndView返回结果
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", message);
        modelAndView.setViewName("error");
        return modelAndView;
    }

}

 

技术分享

 

 5.拦截器Interceptor

/**
 * 拦截器的实现
 * <p>Title: Interceptor1</p>
 * <p>Description: </p>*/

public class Interceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // 方法执行之前处理
        //返回值true:放行 false:拦截
        System.out.println("Interceptor1 preHandle....");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 方法执行完毕,ModelAndView返回之前
        System.out.println("Interceptor1 postHandle....");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 方法执行完毕,ModelAndView返回之后
        System.out.println("Interceptor1 afterCompletion....");
    }

}

 

修改springmvc配置文件

<!--拦截器 -->
    <mvc:interceptors>
        <!--多个拦截器,顺序执行 -->
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.springmvc.interceptor.Interceptor1"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="com.springmvc.interceptor.Interceptor1"></bean> 
    </mvc:interceptor>
</mvc:interceptors>

 

springmvc