栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC学习(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC学习(二)

文章目录

二、简单使用

2.1、注册DispatcherServlet2.2、配置springMVC2.3、控制器Controller

2.3.1、接口定义2.3.2、注解定义 2.4、SpringMVC乱码过滤2.5、测试2.6、注解版测试 三、controller的其他相关

3.1、RestFul 风格3.2、结果跳转

3.2.1、ModelAndView3.2.2、ServletAPI3.2.3、SpringMVC 3.3、参数接收处理

3.3.1、处理提交数据3.3.2、数据显示到前端

二、简单使用

在pom.xml文件引入相关的依赖:主要有Spring框架核心库、Spring MVC、servlet , JSTL

2.1、注册DispatcherServlet

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



    springmvc
    /

2.2、配置springMVC

使用springMVC必须配置springmvc-servlet.xml的三大件:

处理器映射器处理器适配器视图解析器

处理器映射器


处理器适配器


视图解析器


    
    
    
    

2.3、控制器Controller

通过接口定义或注解定义两种方法实现。

2.3.1、接口定义

编写操作业务层Controller ,实现Controller接口,返回一个ModelAndView,装数据,封视图;

package com.rui.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();
        //封装对象,放在ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello"); //相当于 /WEB-INF/jsp/hello.jsp
        return mv;
    }
}

然后再配置文件中注册bean,将自己的类交给SpringIOC容器。


别忘了写跳转的jsp页面

说明:

实现接口Controller定义控制器是较老的办法缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦; 2.3.2、注解定义

@Controller使用注解将自动配置bean@RestController使这个Controller全部返回的是字符串@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。类似的还有(@GetMapping、@PostMapping…)$@GetMapping approx @RequestMapping(method =RequestMethod.GET) $此外还有value属性用以填写映射访问路径@ResponseBody它就不会走视图解释器,会直接返回一个字符串@RequestParam(" ")参数提交的域的名称

在SpingMVC配置文件中


重写HelloController类

package com.rui.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello(Model model){
        System.out.println("调用");
        //封装数据
        model.addAttribute("msg","Hello SpringMVC!Annotation");
        return "hello";//会被视图解释器处理
    }
}

在使用注解开发后,通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置

2.4、SpringMVC乱码过滤

在web.xml配置:


   encoding
   org.springframework.web.filter.CharacterEncodingFilter
   
       encoding
       utf-8
   


   encoding
   /*

2.5、测试

1、配置项目依赖


    
        junit
        junit
        4.12
    
    
        org.springframework
        spring-webmvc
        5.3.14
    
    
        javax.servlet
        servlet-api
        2.5
    
    
        javax.servlet.jsp
        jsp-api
        2.1
    
    
        javax.servlet
        jstl
        1.2
    

2、配置web.xml , 注册DispatcherServlet





    
    
    

    
    
    
    


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


3、编写SpringMVC 的 配置文件springmvc-servlet.xml




    


    
    
    
    
    
    
        
        
        
        
    


    
    


4、编写我们要操作业务Controller-HelloController

package com.rui.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();
        //封装对象,放在ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello"); //相当于 /WEB-INF/jsp/hello.jsp
        return mv;
    }
}

5、写要跳转的jsp页面-hello.jsp

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


    hello


${msg}


6、启动tomcat

注:若遇到maven过滤问题,添加

2.6、注解版测试

1、添加Maven支持


    org.jetbrains
    annotations
    RELEASE
    compile

2、更改配置文件springmvc-servlet.xml以支持注解





    

    

    

    
    
        
        
        
        
    


3、更改HelloController

package com.rui.controller;

import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

//使用注解自动配置bean
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello(@NotNull Model model){
        System.out.println("调用");
        //封装数据
        model.addAttribute("msg","Hello SpringMVC!Annotation");
        return "hello";//会被视图解释器处理
    }
}

4、启动tomcat

三、controller的其他相关 3.1、RestFul 风格

Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上

新建一个类 RestFulController

@Controller
public class RestFulController {

   //映射访问路径
   @RequestMapping("/commit/{p1}/{p2}")
   public String index(@PathVariable int p1, @PathVariable int p2, Model model){
       int result = p1+p2;
       //Spring MVC会自动实例化一个Model对象用于向视图中传值
       model.addAttribute("msg", "结果:"+result);
       //返回视图位置
       return "test";
  }
}

使用RESTful操作资源的优点 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

​ http://127.0.0.1/item/1 查询,GET

​ http://127.0.0.1/item 新增,POST

​ http://127.0.0.1/item 更新,PUT

​ http://127.0.0.1/item/1 删除,DELETE

3.2、结果跳转 3.2.1、ModelAndView

设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .

页面 : {视图解析器前缀} + viewName +{视图解析器后缀}


   
   
   
   

对应的controller类

public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}
3.2.2、ServletAPI

通过设置ServletAPI , 不需要视图解析器 .

1、通过HttpServletResponse进行输出

2、通过HttpServletResponse实现重定向

3、通过HttpServletResponse实现转发

@Controller
public class ResultGo {

   @RequestMapping("/result/t1")
   public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
       rsp.getWriter().println("Hello,Spring BY servlet API");
  }

   @RequestMapping("/result/t2")
   public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
       rsp.sendRedirect("/index.jsp");
  }

   @RequestMapping("/result/t3")
   public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
       //转发
       req.setAttribute("msg","/result/t3");
       req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
  }

}
3.2.3、SpringMVC

forward、redirect

通过SpringMVC来实现转发和重定向 - 无需视图解析器;

测试前,需要将视图解析器注释掉

@Controller
public class ResultSpringMVC {
   @RequestMapping("/rsm/t1")
   public String test1(){
       //转发
       return "/index.jsp";
  }

   @RequestMapping("/rsm/t2")
   public String test2(){
       //转发二
       return "forward:/index.jsp";
  }

   @RequestMapping("/rsm/t3")
   public String test3(){
       //重定向
       return "redirect:/index.jsp";
  }
}

通过SpringMVC来实现转发和重定向 - 有视图解析器;

重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.

可以重定向到另外一个请求实现 .

@Controller
public class ResultSpringMVC2 {
   @RequestMapping("/rsm2/t1")
   public String test1(){
       //转发
       return "test";
  }

   @RequestMapping("/rsm2/t2")
   public String test2(){
       //重定向
       return "redirect:/index.jsp";
       //return "redirect:hello.do"; //hello.do为另一个请求/
  }

}
3.3、参数接收处理 3.3.1、处理提交数据

1、提交的域名称和处理方法的参数名一致

提交数据 : http://localhost:8080/hello?name=yechen

处理方法 :

@RequestMapping("/hello")
public String hello(String name){
   System.out.println(name);
   return "hello";
}

后台输出 : yechen

2、提交的域名称和处理方法的参数名不一致

提交数据 : http://localhost:8080/hello?username=yechen

处理方法 :@RequestParam

//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
   System.out.println(name);
   return "hello";
}

后台输出 : kuangshen

3、提交的是一个对象

要求提交的表单域和对象的属性名一致 , 参数使用对象即可

1、实体类

public class User {
   private int id;
   private String name;
   private int age;
   //构造
   //get/set
   //tostring()
}

2、提交数据 : http://localhost:8080/mvc04/user?name=yechen&id=1001&age=18

3、处理方法 :

@RequestMapping("/user")
public String user(User user){
   System.out.println(user);
   return "hello";
}

后台输出 : User { id=1001, name=‘yechen’, age=18 }

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

3.3.2、数据显示到前端

第一种 : 通过ModelAndView

我们前面一直都是如此 . 就不过多解释

public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}

第二种 : 通过ModelMap

ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("name",name);
   System.out.println(name);
   return "hello";
}

第三种 : 通过Model

Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("msg",name);
   System.out.println(name);
   return "test";
}

小结

就对于新手而言简单来说使用区别就是:

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 linkedMap ,除了实现了自身的一些方法,同样的继承 linkedMap 的方法和特性;

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736965.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号