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

SpringMVC(2)- 注解式开发

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

SpringMVC(2)- 注解式开发

目录

一.使用SpringMVC框架的开发步骤

1.环境搭建 

 2.请求流程

二.SpringMVC框架的基本应用

1.controller类如何接收dispatcher转发的请求

(0)带有注解的方法的规范

(1)注解在controller类中的具体的方法上

(2)注解在controller类上

(3)GET和POST请求方式的注解

2.提交数据的五种方式

(1)方式1:散提交数据

(2)方式2:对象封装提交

(3)方式3:动态占位符提交

 (4)方式4:映射名称不一致

(5)方式5:手工提交数据

3.处理中文乱码

4.controller类的方法的返回值

(1)无返回值void

(2)String返回值

(3)返回基本数据类型

(4)返回对象类型

(5)ModelAndView

5.SpringMVC的四种跳转方式

(1)请求转发至页面(默认)

(2)请求转发至控制器

(3)重定向至页面

(4) 重定向至控制器

6.数据的传递

(1)SpringMVC默认支持的参数类型

(2)参数传递演示

三.注解驱动


一.使用SpringMVC框架的开发步骤

1.环境搭建 

Step1:创建maven工程

Step2:创建web项目

Step3:集成tomcat服务器

Step4:修改pom.xml配置文件

框架就是上依赖 上配置




  4.0.0

  org.example
  Pro1
  1.0-SNAPSHOT
  war

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

  
    UTF-8
    1.8
    1.8
  

  
    
      junit
      junit
      4.11
      test
    

    
      org.springframework
      spring-webmvc
      5.3.19
    

    
      javax.servlet
      javax.servlet-api
      3.1.0
    

  

  
    
        
          src/main/java
          
            ***.properties
          
        
       
        src/main/resources
        
          ***.properties
        
       
    
  

 Step5:创建SpringMVC核心配置文件




    

    

        

        
    

    
        
    

Step6:修改web.xml配置文件




    
        springmvc
        org.springframework.web.servlet.DispatcherServlet

        
            contextConfigLocation
            classpath:springmvc.xml
        
    
    
        springmvc

        *.action
    

 2.请求流程

1.页面请求先经过web.xml文件查看是否有SpringMVC框架,所以要在web.xml中配置dispatcherServlet的信息,就相当于声明了这个servlet。指明这个servlet接收的请求的类型。

2.dispatcherServlet这个类也有很多初始化信息需要配置,所以SpringMVC核心配置文件中配置dispatcherServlet后,要在web.xml中加载信息。

3.初始化的信息包括要告诉dispatcher转发请求的目标对象,也就是具体转发给哪个controller类,所以要先用包扫描去创建这些类。

4.当controller类处理完请求后,还要经过dispatcher处理,则需要指明需要转发的资源,所以要标明前后缀。

二.SpringMVC框架的基本应用

1.controller类如何接收dispatcher转发的请求

由简到繁的方式来介绍controller类的注解方式。

注意controller下的类要有@Controller注解。

(0)带有注解的方法的规范
  • 访问权限是public
  • 方法返回值任意,以前的doGet和doPost只能是void
  • 方法名称任意 不用叫doGet或者doPost
  • 方法可以没有参数,如果有可以是任意类型
  • 要使用@RequestMapping注解来声明一个访问的路径(名称)

(1)注解在controller类中的具体的方法上
注解在方法上
@Controller //spring的注解,交给spring去创建对象
public class Action {
    @RequestMapping(value = "/demo")
    public String demo(){
        System.out.println("访问服务器get");
        return "main";//可以跳到/admin/main.jsp页面上去
    }
}

通过@RequestMapping代替了之前的@WebServlet注解。

如果没有在SpringMVC下配置下面代码,则value的值需要加上后缀名。

    
        
    

(2)注解在controller类上
注解在方法上
@Controller //spring的注解,交给spring去创建对象
@RequestMapping("/user")
public class Action {
    @RequestMapping(value = "/demo")
    public String demo(){
        System.out.println("访问服务器get");
        return "main";//可以跳到/admin/main.jsp页面上去
    }
}

注解到类上相当于在资源上增加了一级目录或包名。如果两个类中的方法上的@RequestMapping的值相同,转发器便不知道将请求转发给哪个controller类,此时可以在类上加注解加以区别。

(3)GET和POST请求方式的注解

 请求路径相同,而请求方法不同,也可以区分具体要请求的方法

@Controller //spring的注解,交给spring去创建对象
@RequestMapping("/user")
public class Action {
@RequestMapping(value = "/demo",method = RequestMethod.GET)
    public String demo(){
        System.out.println("访问服务器get");
        return "main";//可以跳到/admin/main.jsp页面上去
    }
    @RequestMapping(value = "/demo",method = RequestMethod.POST)
    public String demo2(){
        System.out.println("访问服务器post");
        return "main";//可以跳到/admin/main.jsp页面上去
    }
}

请求的路径名相同,但是请求方式不同,也看作是请求不同的资源。

2.提交数据的五种方式

(1)方式1:散提交数据

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


方式1
@Controller
public class Para {
    @RequestMapping("/Para1")
    public String para1(String myname,int age){
        System.out.println("myname:"+myname+",age:"+age);
        return "main";
    }
}

1.要求请求参数的name值要和controller类的方法中的参数名相同

2.不需要关心方法中参数的转换问题,SpringMVC会进行类型自动转换

(2)方式2:对象封装提交
方式2
    @RequestMapping("/Para2")
    public String para2(User user){
        System.out.println("myname:"+user.getMyname()+",age:"+user.getAge());
        return "main";
    }

1.需要创建User实体类,并且实体类的属性名要和请求参数的name值相同,就可以自动创建对象。

2.实体类要有set和get方法

public class User {
    private String myname;
    private int age;

    public String getMyname() {
        return myname;
    }

    public void setMyname(String myname) {
        this.myname = myname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

(3)方式3:动态占位符提交
方式3
方式三提交
    @RequestMapping("/Para3/{myname}/{age}")
    public String para3(@PathVariable("myname") String name,@PathVariable("age") int age){
        System.out.println("myname:"+name+",age:"+age);
        return "main";
    }

方式3常用于链接方式的请求。

@PathVariable先从myname这个请求参数取值,再注入到name上。

也可以只写@PathVaribale,默认这个注解里的值和上方大括号里的相同,引用时形参名字要写myname。

@RequestMapping中的大括号中的参数名可以随意取,但这个名字要么和@PathVariable的值相同,要么和形参名字相同(当不写@PathVariable的值时)。

 (4)方式4:映射名称不一致

方式4
    @RequestMapping("/Para4")
    public String para4(@RequestParam("myname") String uname,@RequestParam("age") int uage){
        System.out.println("myname:"+uname+",age:"+uage);
        return "main";
    }

处理请求参数的name值和方法中的参数名不相同的情况。

注解@RequestParam先从myname这个请求参数中取值,再将值注入到uname上。

(5)方式5:手工提交数据
方式5
    @RequestMapping("/Para5")
    public String para5(HttpServletRequest request){
        String myname = request.getParameter("myname");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println("myname:"+myname+",age:"+age);
        return "main";
    }

这种方法就是跟之前获取参数的方式相同了。

3.处理中文乱码

当post请求时,传过来的请求参数如果是中文的话会乱码。

可以在web.xml中配置过滤器设置编码格式来处理乱码问题


    
        encode
        org.springframework.web.filter.CharacterEncodingFilter

        
            encoding
            UTF-8
        
        
            forceRequestEncoding
            true
        
        
            forceResponseEncoding
            true
        
    
    
        encode

        /*
    

4.controller类的方法的返回值

(1)无返回值void

一般用于Ajax请求

(2)String返回值

客户端资源的地址,自动拼接前缀后缀,还可以屏蔽自动拼接字符串,可以指定返回的路径

(3)返回基本数据类型

用户Ajax请求

返回学生集合案例

Step1:添加Jackson依赖


    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.8
    
    

Step2:在webapp目录下创建js目录,添加jQuery函数库

Step3:前端发送Ajax请求

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


    Title
    


访问服务器返回学生集合

    等待服务器返回数据




Step4:后端处理Ajax请求

@Controller
public class Ajax {
    @RequestMapping("/list")
    @ResponseBody //解析Ajax请求,还要在springmvc.xml中添加注解驱动
    public List getList(){
        List list = new ArrayList<>();
        list.add(new Student("张三",18));
        list.add(new Student("李四",19));
        return list;//SpringMVC框架负责将集合转为json数组
    }
}

Step5:添加注解驱动

    

注意:

1.Ajax请求要加@ResponseBody注解

2.注解驱动内部还有其他属性可以更改,可以用下面代码代替上面注解驱动代码

    
        
    

3. 在处理Ajax请求时,不需要视图解析器,Ajax请求哪来的回哪去

(4)返回对象类型

返回json格式的对象,自动将对象或集合转为json,使用的是Jackson工具进行转换,必须要添加Jackson依赖,一般用于Ajax请求

(5)ModelAndView

返回数据和视图对象,现在用的很少。

5.SpringMVC的四种跳转方式

(1)请求转发至页面(默认)

直接返回资源名的字符串,视图解析器会自动添加前缀和后缀

(2)请求转发至控制器

返回forward:/资源名的字符串,如"forward:/user.action"。视图解析器便不会添加前缀和后缀了。

(3)重定向至页面

返回redirect:/资源名的字符串,如"redirect:/index.jsp",视图解析器便不会添加前缀和后缀了。

(4) 重定向至控制器

 返回redirect:/资源名的字符串,如"redirect:/user.action",视图解析器便不会添加前缀和后缀了。

  

请求转发页面
请求转发控制器
重定向页面
重定向控制器
@Controller
public class Jump {
    @RequestMapping("/jump1")
    public String  jump1(){
        System.out.println("请求转发页面");
        return "main";
    }
    @RequestMapping("/jump2")
    public String jump2(){
        System.out.println("请求转发控制器");
        return "forward:/other";
    }
    @RequestMapping("/jump3")
    public String jump3(){
        System.out.println("重定向页面");
        return "redirect:/admin/main.jsp";
    }
    @RequestMapping("/jump4")
    public String jump4(){
        System.out.println("重定向控制器");
        return "redirect:/other";
    }
}
@Controller
public class JumoToMe {
    @RequestMapping("/other")
    public String  other(){
        System.out.println("跳到了other");
        return "main";
    }
}

6.数据的传递

(1)SpringMVC默认支持的参数类型
  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model
  • Map
  • ModelMap

1.Map,Model,ModelMap和request都一样,都使用请求作用域进行数据传递,所以服务器的跳转必须是请求转发。

2.这些参数可以直接写到方法的形参中,dispatcher就会将其对象转发进来。

3.只有请求转发才能携带数据。

(2)参数传递演示

    @RequestMapping("/data")
    public String data(HttpServletRequest request,
                       HttpServletResponse response,
                       HttpSession session,
                       Model model,
                       Map map,
                       ModelMap modelMap){
        int a = 10;
        request.setAttribute("requesta",a);
        session.setAttribute("sessiona",a);
        model.addAttribute("modela",a);
        map.put("mapa",a);
        modelMap.addAttribute("modelMapa",a);
        return "main";
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


main...
${requesta}
${sessiona}
${mapa}
${modela}
${modelMapa}
${param.name}

 param代表整个请求中的参数集合,name是controller的上一个页面传递过来的参数

data

三.注解驱动

 标签

在springmvc.xml中写了这行代码后,SpringMVC框架会自动注册两个bean,分别是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter,是springmvc为@controller分发请求所必须的。

注解驱动还提供其他功能

 

走一遍流程图

第一个小帮手HandlerMapping去解析请求路径,可以找到访问资源的名称(去掉后缀和前缀)

第二个小帮手 HandlerAdapter根据资源的名称去创建控制器的对象,生成的方式可以是bean标签,可以是注解方式。拿到对象的时候,里面的数据都注入成功了,比如方法的参数,对象的属性等

最后的Handler就是生成的对象,也就是controller对象

接下来这个对象还会去调用业务逻辑层,数据访问层

再将数据返回到controller对象,再返回给dispatcher要转发的路径,又调用下一个小帮手,ViewResolver(当返回的是字符串的时候并且没有加forward和redirect),添加前缀和后缀

再返回到dispatcher,带着放在作用域中的数据,判断是转发到哪个页面,将数据渲染到页面上,一并交给客户端

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

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

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