SpringMVC基础二(RestFul、接收数据、视图跳转)

@ReauestMapping

@ReauestMapping注解用于映射url到控制器类或一个特定的处理程序方法 。可用于类或方法上,用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

创建一个新项目:设置为web项目

编写web.xml(此配置也几乎不更改)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

编写配置文件springmvc-servlet.xml(几乎不会更改此内容)

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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <context:component-scan base-package="com.serenity.controller"/>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

综上:项目结构:

编写一个Controller类实现Controller接口:

java 复制代码
@Controller
@RequestMapping("/c1")
public class ControllerTest1 {
    @RequestMapping("/t1")
    public String test1(Model model){
        model.addAttribute("msg","ControllerTest1");
        return "test";
    }
}

编写test.jsp文件:

测试:

RestFul风格

概念

RestFul风格:就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

功能

  • 资源:互联网所有的事物都可以被抽象为资源。
  • 资源操作:使用POSTDELETE、PUTGET ,使用不同方法对资源进行操作。
  • 分别对应:添加、删除、修改、查询。

传统方式 操作资源:通过不同的参数来实现不同的效果!方法单一,post和get

  • http:localhost:8080/queryItem.action?id=1 查询,GET
  • http:localhost:8080/saveItem.action 新增,POST
  • http:localhost:8080/updateItem.action 更新,POST
  • http:localhost:8080/deleteItem.action?id=1 删除,GET或POST

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

  • http:localhost:8080/Item/1 查询,GET
  • http:localhost:8080/Item 新增,POST
  • http:localhost:8080/Item 更新,PUT
  • http:localhost:8080/Item/1 删除,DELETE

传统方式测试:

java 复制代码
@Controller
public class RestFulController {
    //http://localhost:8080/add?a=1&b=2
    @RequestMapping("/add")
    public String test1(int a, int b, Model model){
        int res=a+b;
        model.addAttribute("msg","结果为"+res);
        return "test";
    }
}

使用ReStFul:

java 复制代码
//http://localhost:8080/add/1/2,使用post时需要表单提交
    @PostMapping("/add/{a}/{b}")
    //@PathVariable注解让方法参数的值对应绑定到一个URL模板变量上。
    public String test2(@PathVariable int a, @PathVariable int b, Model model){
        int res=a+b;
        model.addAttribute("msg","结果1为"+res);
        return "test";
    }
    //http://localhost:8080/add/1/2
    @GetMapping("/add/{a}/{b}") 
    public String test3(@PathVariable int a, @PathVariable int b, Model model){
        int res=a+b;
        model.addAttribute("msg","结果2为"+res);
        return "test";
    }

表单提交时用Post,导航栏直接输入数字是用Get,最后结果的url都是一样的,但是方法不同。

除了使用注解规定提交的方法,也可以属性设置,如下:

return返回地址时默认使用转发。

需要用重定向时:

return "redirect:/index.jsp"

使用RestFul好处:

  • 使路径变得更加简洁
  • 获得参数更加方便,框架会自动进行类型转换。
  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法.

结果跳转方式

ModelAndView对象,根据View的名称和视图解析器跳转到指定的页面

视图解析器前缀+viewName+视图解析器后缀

一般结果(跳转、重定向)都存放在WEB-INF/jsp下的文件,因为这里用户不可见,如果直接存放在web下用户可见。

ServletAPI,不需要视图解析器。

1、通过HttpServletResponse进行输出

resp.getWriter().println("Hello,SpringMVC");

2、通过HttpServletResponse实现重定向

resp.sendRedirect("/index.jsp");

3、通过HttpServletResponse实现转发

req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);

SpringMVC实现转发和重定向

此处无需视图解析器

将视图解析器注释掉

转发:

java 复制代码
@Controller
public class ModelTest1 {
    @RequestMapping("/m1/t1")
    public String test1(Model model){
        model.addAttribute("msg","ModelTest1");
        //转发,
        return "/WEB-INF/jsp/test.jsp";
        //return "forward:/WEB-INF/jsp/test.jsp";
    }
}

重定向:

java 复制代码
@Controller
public class ModelTest1 {
    @RequestMapping("/m1/t1")
    public String test1(Model model){
        model.addAttribute("msg","ModelTest1");
        //重定向
        return "redirect:/index.jsp";
    }
}

相对于有视图解析器,无视图解析器时,需要写完整的重新定或转发地址。

数据处理

处理提交数据

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

提交数据:http://localhost:8080/user/t1?name=serenity

实体类:

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}

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

提交数据:http://localhost:8080/user/t1?**username=**serenity

3、提交的是一个对象,会匹配User对象中的字段名,名字一致就OK,否者匹配不到

要求提交的表单域和对象的属性名一致 ,参数使用对象即可。提交数据:http://localhost:8080/user?id=1\&**name=**serenity\&age=19

处理办法:

java 复制代码
 @GetMapping("/t2")
    //localhost:8080/user/t1?name=xxx
    public String test2(User user, Model model){
        System.out.println("接收到前端的参数为"+user);
        //将返回的结果传递给前端,使用model传递
        model.addAttribute("msg",user);
        //跳转视图
        return "test";
    }

数据显示到前端

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

法二:通过Model:存储数据

法三:通过ModelMap:继承了LinkMap,除了实现了自身的一些方法,同样的继承了LinkedMap的方法和特性。

相关推荐
alden_ygq几秒前
当java进程内存使用超过jvm设置大小会发生什么?
java·开发语言·jvm
水银嘻嘻7 分钟前
web 自动化之 Unittest 四大组件
运维·前端·自动化
(((φ(◎ロ◎;)φ)))牵丝戏安12 分钟前
根据输入的数据渲染柱形图
前端·css·css3·js
triticale14 分钟前
【Java】网络编程(Socket)
java·网络·socket
淘源码d17 分钟前
什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP
java·源码·erp·erp源码·企业资源计划·企业erp·工厂erp
源码方舟18 分钟前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
蜗牛沐雨19 分钟前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教20 分钟前
Rust快速入门:从零到实战指南
开发语言·后端·rust
wuyijysx23 分钟前
JavaScript grammar
前端·javascript
溪饱鱼1 小时前
第6章: SEO与交互指标
服务器·前端·microsoft