09-SpringMVC

请求方式和请求的数据格式;响应方式和响应的数据格式。

09-SpringMVC_第1张图片
SpringMVC处理流程

@RequestMapping(value="/testXml",produces = "text/plain;charset=utf-8"):接收请求,默认响应是跳转页面,producesconsumer是设置HTTP请求头和HTTP响应头的Content-Type
@ResponseBody:表示返回的数据,不进行页面跳转。注:返回json格式数据,要么自己封装要么开启注解驱动。返回xml数据要么自己封装要么在返回的Bean对象使用@XmlRootElement注解。

@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用;
@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

会先判断响应数据是否能按照返回类型进行转换,如果能则自动尝试转化(依据实现了哪种HttpMessageConverter)。

一、处理请求和响应

1.1 配置



    
    
    
    
        
        
    
    
    
    
    
    
    

09-SpringMVC_第2张图片
annotation-driven

1.2 请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()+"://" +
         request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>


    
    My Sample
    
    


//带“/”和不带“/”区别
/**
1. 带“/” 是相对路径,相对的项目根路径:http://localhost:8080/test1。不含项目名称,所以test1必须写上项目名称
2.不带“/”是参考路径,参考当前页面地址栏中的地址, 项目启动后地址栏http://localhost:8080/Web,含项目地址所以,不需要写项目名称
3.建议做法:
<%    
 String basePath = request.getScheme()+"://" +
       request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"; 
%>    
**/

test1:test1
test2:test2
test3:test3
test4:test4
test5:test5
test6:





<
testRequestHeader:testRequestHeader
testCookieValue:testCookieValue
testSessionAttributes:testSessionAttributes
getSessionAttributes:getSessionAttributes
delSessionAttributes:delSessionAttributes

1.3 处理和响应

@Controller
//注解只用作用在 类 上,作用是将指定的 Model 的键值对保存在 session 中。
//可以让其他请求共用 session 中的键值对
@SessionAttributes(value={"msg"})
public class UserController {
    @Autowired
    private UserService userServiceImpl;
    //---------------------SpringMvc知识点1:请求和响应START--------------------
    /*test1:
    * 1.请求内容:String
    * 2.请求方式:get
    * 3.参数格式:请求参数名称与接收参数名称部分一致
    * 4.处理请求:按照参数名和类型赋值
    * 5.响应内容:model and view
    * */
    @RequestMapping(value = "/test1")
    public ModelAndView test1(@RequestParam(name = "name") String userName,Integer age){
        UserDto userDto = new UserDto();
        userDto.setAge(age);
        userDto.setUsername(userName);
        ModelAndView mv = new ModelAndView();
        mv.setViewName("result");
        mv.addObject(userDto);
        return mv;
    }

    /*test2:
     * 1.请求内容:String
     * 2.请求方式:get
     * 3.参数格式:请求参数名称与接收参数名称一致
     * 4.处理请求:使用DTO接收,@ModelAttribute将请求参数赋值给对象
     * 5.响应内容:model and view
     * */
    @RequestMapping(value = "/test2")
    public String test2(@ModelAttribute UserDto userDto, Model model){
        model.addAttribute("userDto", userDto);
        return "result";
    }
    /*test3:
     * 1.请求内容:String
     * 2.请求方式:get
     * 3.参数格式:请求参数名称与接收参数名称一致
     * 4.处理请求:使用DTO接收,@ModelAttribute将请求参数赋值给对象
     * 5.响应内容:null ,使用@ResponseBody,否则找不到test3.jsp
     * */
    @RequestMapping(value = "/test3")
    @ResponseBody
    public void test3(@ModelAttribute UserDto userDto){

    }
    /*test4:
     * 1.请求内容:对象
     * 2.请求方式:get
     * 3.参数格式:请求参数名称与接收参数名称一致
     * 4.处理请求:使用DTO接收,@ModelAttribute将请求参数赋值给对象
     * 5.响应内容:model
     * */
    @RequestMapping(value = "/test4")
    public void test4(@ModelAttribute UserDto userDto, HttpServletRequest request, HttpServletResponse response){
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        try {
            response.getWriter().print(request.getParameter("username")+"你好");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
    /*test5:
     * 1.请求内容:String
     * 2.请求方式:get
     * 3.参数格式:restFul
     * 4.处理请求: @PathVariable解析路径中的值
     * 5.响应内容: mode and view
     * */
    @RequestMapping(value = "/test5/{name}")
    public String test5(@PathVariable(name="name") String name, Model model){
        // 底层会存储到request域对象中
        model.addAttribute("userDto", name);
        return "result";
    }
    /*test6:
     * 1.请求内容:对象
     * 2.请求方式:post
     * 3.参数格式:表单
     * 4.处理请求: @ModelAttribute
     * 5.响应内容: model and view
     * */
    @RequestMapping(value = "/test6")
    public String test6(@ModelAttribute UserDto userDto, Model model){
        // 底层会存储到request域对象中
        model.addAttribute("userDto", userDto);
        return "result";
    }
    /*testAjaxJson1:
     * 1.请求内容:对象
     * 2.请求方式:ajax
     * 3.参数格式:json
     * 4.处理请求: @RequestBody 解析XML或者json
     * 5.响应内容: model(json)
     * */
    @RequestMapping(value = "/testAjaxJson1")
    @ResponseBody
    public User testAjaxJson1(@RequestBody User user){
        return user;
    }
    /*testAjaxJson2:
     * 1.请求内容:string
     * 2.请求方式:ajax
     * 3.参数格式:json
     * 4.处理请求: @RequestBody 解析XML或者json
     * 5.响应内容: null
     * */
    @RequestMapping("/testAjaxJson2")
    public void testAjaxJson2(String name){
        return  ;
    }
    /*testAjaxJson3:
     * 1.请求内容:string
     * 2.请求方式:ajax
     * 3.参数格式:json
     * 4.处理请求: @RequestBody 解析XML或者json
     * 5.响应内容: model(string)
     * */
    @RequestMapping("/testAjaxJson3")
    @ResponseBody
    public String testAjaxJson3(String name){
        return name ;
    }
    /*testAjaxJson4:
     * 1.请求内容:对象
     * 2.请求方式:ajax
     * 3.参数格式:xml
     * 4.处理请求: @RequestBody 解析XML或者json
     * 5.响应内容: model(xml)
     * */
 
 @RequestMapping(value="/testAjaxJson4",consumes="application/xml")
    @ResponseBody
    public UserDto testAjaxJson4(@RequestBody UserDto user){
        return user;
    }

    /*
     * testRequestHeader
     * */
    @RequestMapping(value="/testRequestHeader")
    public void testRequestHeader(@RequestHeader(value="Accept") String header, HttpServletRequest request,HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        try {
            response.getWriter().print(header);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ;
    }
    /*
     * testCookieValue
     * */
    @RequestMapping(value="/testCookieValue")
    public void testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue, HttpServletRequest request,HttpServletResponse response){
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        try {
            response.getWriter().print(cookieValue);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
    /*
     * SessionAttributes
     * */
    //设置
    @RequestMapping(value="/testSessionAttributes")
    @ResponseBody
    public void testSessionAttributes(Model model){
        // 底层会存储到request域对象中
        model.addAttribute("msg","薛增博");
    }
    //获取
    @RequestMapping(value="/getSessionAttributes")
    public void getSessionAttributes(ModelMap modelMap,HttpServletResponse response){
        String userDto = (String) modelMap.get("msg");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        try {
            response.getWriter().print(userDto);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
    // 清除
    @RequestMapping(value="/delSessionAttributes")
    public void delSessionAttributes(SessionStatus status,ModelMap modelMap,HttpServletResponse response){
        status.setComplete();
        String userDto = (String) modelMap.get("msg");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        try {
            response.getWriter().print(userDto);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 请求的转发
        // return "forward:/WEB-INF/pages/success.jsp";
        // 重定向
        //return "redirect:/index.jsp";
        return ;
    }

    //-------------SpringMvc知识点1:请求和响应 END------------

}

二、文件上传




    
    
    
    
        
        
    

    
    
    
    
    
        
    
    
    

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


    

传统文件上传

选择文件:

Springmvc文件上传

选择文件:

跨服务器文件上传

选择文件:
@Controller
@RequestMapping("/user")
public class UserController {
    // 跨服务器文件上传
    @RequestMapping("/fileupload3")
    public String fileuoload3(MultipartFile upload) throws Exception {
        System.out.println("跨服务器文件上传...");

        // 定义上传文件服务器路径
        String path = "http://localhost:9090/uploads/";
        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        // 创建客户端的对象
        Client client = Client.create();
        // 和图片服务器进行连接
        WebResource webResource = client.resource(path + filename);
        // 上传文件
        webResource.put(upload.getBytes());
        return "success";
    }

    // SpringMVC文件上传 
    @RequestMapping("/fileupload2")
    public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc文件上传...");
        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判断,该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            // 创建该文件夹
            file.mkdirs();
        }
        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        // 完成文件上传
        upload.transferTo(new File(path,filename));
        return "success";
    }

    // 文件上传
    @RequestMapping("/fileupload1")
    public String fileuoload1(HttpServletRequest request) throws Exception {
        System.out.println("文件上传...");
        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判断,该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            // 创建该文件夹
            file.mkdirs();
        }
        // 解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解析request
        List items = upload.parseRequest(request);
        // 遍历
        for(FileItem item:items){
            // 进行判断,当前item对象是否是上传文件项
            if(item.isFormField()){
                // 说明普通表单向
            }else{
                // 说明上传文件项
                // 获取上传文件的名称
                String filename = item.getName();
                // 把文件的名称设置唯一值,uuid
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"_"+filename;
                // 完成文件上传
                item.write(new File(path,filename));
                // 删除临时文件
                item.delete();
            }
        }
        return "success";
    }
}

三、异常处理




    
    
    
    
        
        
    
    
    
    
    
    
    
    
    

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testException")
    public String testException() throws SysException{
        System.out.println("testException执行了...");
        try {
            // 模拟异常
            int a = 10/0;
        } catch (Exception e) {
            // 打印异常信息
            e.printStackTrace();
            // 抛出自定义异常信息
            throw new SysException("查询所有用户出现错误了...");
        }
        return "success";
    }
}
public class SysException extends Exception{
    private String message;
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public SysException(String message) {
        this.message = message;
    }
}
public class SysExceptionResolver implements HandlerExceptionResolver{
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 获取到异常对象
        SysException e = null;
        if(ex instanceof SysException){
            e = (SysException)ex;
        }else{
            e = new SysException("系统正在维护....");
        }
        // 创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg",e.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

四、拦截器

Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。

拦截器链(Interceptor Chain):拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

  • 过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。
  • 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
  • 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
  • 拦截器只会拦截访问的控制器方法(Controller),如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。

拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。
拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。即可支配的资源不一样。

09-SpringMVC_第3张图片
image.png




    
    

    
    
        
        
    
    
    
    
    

    
    
        
        
            
            
            
            
            
        

        
        
            
            
            
            
            
        
    
    
    

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("testInterceptor执行了...");
        return "success";
    }
}
public class MyInterceptor1 implements HandlerInterceptor{

    /**
     * 预处理,controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * return false不放行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1执行了...前1111");
        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        return true;
    }

    // 后处理方法,controller方法执行后,success.jsp执行之前
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1执行了...后1111");
        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
    }

    //success.jsp页面执行后,该方法会执行   
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1执行了...最后1111");
    }
}

五、SSM整合

确保配置文件加载顺序:
1.Spring:在Tomcat启动是利用监听器加载自己配置文件。
2.SpringMVC:自己的将Controller放入IOC,用自己配置文件即可。
3.Mybatis:将生成的代理DAO交给IOC即可(配置sqlSessionFactory)。

09-SpringMVC_第4张图片
image.png

org.springframework.web.context.ContextLoaderListener监听器中的核心:AbstractApplicationContext.refresh()完成Bean初始化。

public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();
            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);
                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);
                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);
                // Initialize message source for this context.
                initMessageSource();
                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();
                // Initialize other special beans in specific context subclasses.
                onRefresh();
                // Check for listener beans and register them.
                registerListeners();
                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);
                // Last step: publish corresponding event.
                finishRefresh();
            }

与bean初始化保持一致。

09-SpringMVC_第5张图片
bean初始化



  Archetype Created Web Application
  
  
    contextConfigLocation
    classpath:applicationContext.xml
  

  
  
    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
  
  
    characterEncodingFilter
    /*
  
 
  
  
    org.springframework.web.context.ContextLoaderListener
  

  
  
    dispatcherServlet
    org.springframework.web.servlet.DispatcherServlet
    
    
      contextConfigLocation
      classpath:springmvc.xml
    
    
    1
  
  
    dispatcherServlet
    /
  

applicationContext.xml:




    
    
        
        
    

    
    
    
        
        
        
        
    

    
    
        
    

    
    
        
    

    
    
    
        
    

    
    
        
            
            
        
    

    
    
        
    

springmvc.xml:




    
    
        
    

    
    
        
        
    

    
    
    
    

    
    

pom.xml:




  4.0.0

  cn.itcast
  ssm
  1.0-SNAPSHOT
  war

  ssm Maven Webapp
  
  http://www.example.com

  
    UTF-8
    1.8
    1.8
    5.0.2.RELEASE
    1.6.6
    1.2.12
    5.1.6
    3.4.5
  

  
    
    
      org.aspectj
      aspectjweaver
      1.6.8
    

    
      org.springframework
      spring-aop
      ${spring.version}
    

    
      org.springframework
      spring-context
      ${spring.version}
    

    
      org.springframework
      spring-web
      ${spring.version}
    

    
      org.springframework
      spring-webmvc
      ${spring.version}
    

    
      org.springframework
      spring-test
      ${spring.version}
    

    
      org.springframework
      spring-tx
      ${spring.version}
    

    
      org.springframework
      spring-jdbc
      ${spring.version}
    

    
      junit
      junit
      4.12
      compile
    

    
      mysql
      mysql-connector-java
      ${mysql.version}
    

    
      javax.servlet
      servlet-api
      2.5
      provided
    

    
      javax.servlet.jsp
      jsp-api
      2.0
      provided
    

    
      jstl
      jstl
      1.2
    

    
    
      log4j
      log4j
      ${log4j.version}
    

    
      org.slf4j
      slf4j-api
      ${slf4j.version}
    

    
      org.slf4j
      slf4j-log4j12
      ${slf4j.version}
    

    
    
      org.mybatis
      mybatis
      ${mybatis.version}
    

    
      org.mybatis
      mybatis-spring
      1.3.0
    

    
      c3p0
      c3p0
      0.9.1.2
      jar
      compile
    
  

  
    ssm
    
      
        
          maven-clean-plugin
          3.0.0
        
        
        
          maven-resources-plugin
          3.0.2
        
        
          maven-compiler-plugin
          3.7.0
        
        
          maven-surefire-plugin
          2.20.1
        
        
          maven-war-plugin
          3.2.0
        
        
          maven-install-plugin
          2.5.2
        
        
          maven-deploy-plugin
          2.8.2
        
      
    
  

你可能感兴趣的:(09-SpringMVC)