SpringMVC常用操作

2022-09-14 21:36:00 浏览数 (1)

1、springMVC常用注解-01

1.1、新建springmvc项目

1.1.1、创建新项目

通过maven创建一个新项目smvc002

1.1.2、导包

pom.xml

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.tyschool</groupId>
  <artifactId>smvc002</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>smvc002 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.2.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>smvc002</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
1.1.3、启动服务

启动服务、配置服务

http://localhost:8080/smvc002/index.jsp

1.1.4、配置springmvc.xml文件

springmvc.xml

代码语言:javascript复制
<?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
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <!--配置扫描器,扫描注解-->
    <context:component-scan base-package="com.tyschool"></context:component-scan>
    <!--配置视图解析器,配置前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>
1.1.5、配置web.xml文件

web.xml

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        id="WebApp_ID" version="3.1">
  <display-name>Archetype Created Web Application</display-name>
  <!--配置SpringMVC核心,前置控制器DispatcherServlet -->
  <servlet>
    <servlet-name>SpringMVCDispathcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置初始化参数,用来读取springmvc.xml文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc.xml</param-value>
    </init-param>
    <!--配置servlet的对象的创建时间点:应用加载时创建。取值只能是非0正整数,表示启动顺序-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!--前置控制器,映射所有地址-->
  <servlet-mapping>
    <servlet-name>SpringMVCDispathcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

1.2、RequestParam

1.2.1、作用

将请求中指定名称的参数,给控制器中的形参赋值。

1.2.2、属性

value:请求参数中的名称。

required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

1.2.3、案例

创建:index.jsp

pages/index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
执行成功!!!!
</body>
</html>

创建:TestController.java

代码语言:javascript复制
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller("testController")
public class TestController {
    @RequestMapping("/testParams")
    public String testRequestParams(@RequestParam("username") String uname,@RequestParam(value="password") String pword){
        System.out.println(uname ":" pword);
        return "index";
    }
}

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="testParams" method="post">
    username:<input type="text" name="username"/>
    password:<input type="text" name="password"/>
    <input type="submit" value="登录">
</form>
</body>
</html>

2、springMVC常用注解-02

2.1、RequestBody

2.1.1、作用

用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。

2.1.2、属性

required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。

2.1.3、案例

创建:TestController.java

代码语言:javascript复制
@RequestMapping("/testBody")
public String testRequestBody(@RequestBody(required = false) String body){
        System.out.println(body);
        return "index";
}

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="testBody" method="post">
    username:<input type="text" name="username"/>
    password:<input type="text" name="password"/>
    <input type="submit" value="登录">
</form>
</body>
</html>

2.2、PathVariable

2.2.1、作用

用于绑定 url 中的占位符。

例如:请求 url 中 /delete/{id},这个**{id}**就是 url 占位符。

url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

2.2.2、属性

value:用于指定 url 中占位符名称。

required:是否必须提供占位符。

2.2.3、案例

创建:TestController.java

代码语言:javascript复制
@RequestMapping("/testPath/{mid}")
    public String testPathVariable(@PathVariable("mid") Integer mid){
        System.out.println(mid);
        return "index";
}

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="testPath/1">pathVariable 注解</a>
</body>
</html>

2.3、RequestHeader

2.3.1、作用

用于获取请求消息头。

2.3.2、属性

value:提供消息头名称

required:是否必须有此消息头

2.3.3、案例

创建:TestController.java

代码语言:javascript复制
 @RequestMapping("/testHeader")
    public String testRequestHeader(@RequestHeader(value="Accept-Language",required = false) String header){
        System.out.println(header);
        return "index";
    }

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="testHeader">RequestHeader 注解</a>
</body>
</html>

注意:

3、springMVC常用注解-03

3.1、CookieValue

3.1.1、作用

用于把指定 cookie 名称的值传入控制器方法参数。

3.1.2、属性

value:指定 cookie 的名称。

required:是否必须有此 cookie。

3.1.3、案例

创建:TestController.java

代码语言:javascript复制
@RequestMapping("/testCookie")
    public String testCookieValue(@CookieValue(value="JSESSIONID",required = false) String cookie){
        System.out.println(cookie);
        return "index";
    }

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="testCookie">CookieValue 注解</a>
</body>
</html>

注意:

3.2、SessionAttribute

3.2.1、作用

用于多次执行控制器方法间的参数共享。。

3.2.2、属性

value:用于指定存入的属性名称

type:用于指定存入的数据类型。

3.2.3、案例

需求:

完成登录信息的缓存、获取、清除

创建:TestController.java

代码语言:javascript复制
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;

@Controller("testController")
@SessionAttributes(value={"username","password"},types={Integer.class})
public class TestController {
    @RequestMapping("/testSet")
    public String setSession(Model model){
        System.out.println("存入数据:");
        model.addAttribute("username","zhangsan");
        model.addAttribute("password","zhangsan123456");
        return "index";
    }
    @RequestMapping("/testGet")
    public String getSession(ModelMap modelMap){
        System.out.println("获取数据:");
        System.out.println(modelMap.get("username") ":" modelMap.get("password"));
        return "index";
    }
    @RequestMapping("/testClear")
    public String clearSession(SessionStatus sessionStatus){
        System.out.println("清除数据");
        sessionStatus.setComplete();
        return "index";
    }
}

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="testSet">登录信息缓存</a><br/>
<a href="testGet">登录信息获取</a><br/>
<a href="testClear">登录信息清除</a>
</body>
</html>

4、springMVC常用注解-04

4.1、ModelAttribute

4.1.1、作用

可以用于修饰方法和参数:

出现在方法上:表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。

出现在参数上:获取指定的数据给参数赋值。

4.1.2、属性

value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。

4.2、案例

4.2.1、案例-pojo-修饰方法

创建:Manager.java

代码语言:javascript复制
import java.io.Serializable;

public class Manager implements Serializable {
    private int mid;
    private String uname;
    private String pword;

    public int getMid() {
        return mid;
    }

    public void setMid(int mid) {
        this.mid = mid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPword() {
        return pword;
    }

    public void setPword(String pword) {
        this.pword = pword;
    }

    @Override
    public String toString() {
        return "Manager{"  
                "mid="   mid  
                ", uname='"   uname   '''  
                ", pword='"   pword   '''  
                '}';
    }
}

创建:TestController.java

代码语言:javascript复制
@ModelAttribute
    public void viewModel(Manager m){
        System.out.println("执行到了这里:" m.getUname());
    }
    @RequestMapping("/testModel")
    public String testModelAttribute(Manager m){
        System.out.println("执行到了控制器这里:" m.getUname());
        return "index";
    }

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="testModel?uname=zhangsan">ModelAttribute 注解</a>
</body>
</html>
4.2.2、案例-Map-修饰方法-带返回值

需求:

通过id,完成管理员信息查询。带返回值处理

创建:TestController.java

代码语言:javascript复制
//查询数据库操作
    @ModelAttribute
    public Manager viewModel(int mid){
        Manager m=findById(mid);
        System.out.println("执行到了这里:" m);
        return m;
    }
    //模拟查询操作
    Manager findById(int mid){
        Manager m=new Manager();
        m.setUname("zhangsan");
        m.setPword("lisi");
        m.setMid(mid);
        return m;
    }
    @RequestMapping("/testFind")
    public String findBy(Manager m){
        System.out.println(m);
        return "index";
    }

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="testFind" method="post">
    mid:<input type="text" name="mid" ><br/>
    <input type="submit" value="查询">
</form>
</body>
</html>
4.2.3、案例-Map-修饰方法-不带返回值

需求:

通过id,完成管理员信息查询。不带返回值处理

创建:TestController.java

代码语言:javascript复制
 @ModelAttribute
    public void viewModel1(int mid, Map<String,Manager> map){
        Manager m=findById1(mid);
        System.out.println("执行到这里的:" m);
        map.put("m1",m);
    }
    //查询数据库操作
    public Manager findById1(int mid){
        Manager m=new Manager();
        m.setUname("zhangsan");
        m.setPword("lisi");
        m.setMid(mid);
        return m;
    }
    @RequestMapping("/testFind1")
    public String findBy1(@ModelAttribute("m1")Manager m){
        System.out.println(m);
        return "index";
    }

创建:index.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="testFind1" method="post">
    mid:<input type="text" name="mid" ><br/>
    <input type="submit" value="查询">
</form>
</body>
</html>

5、数据响应

5.1、返回值为:String

字符串可以用来指定逻辑视图名,通过视图解析器解析为物理视图地址。

代码语言:javascript复制
@RequestMapping("/testBody")
    public String testRequestBody(@RequestBody(required = false) String body){
        System.out.println(body);
        return "index";
}

return "index";
通过视图解析器后:
/pages/index.jsp

5.2、返回值为:void

void可以用在ServletAPI对象的控制器中。

代码语言:javascript复制
@RequestMapping("/servletapi")
    public void sayServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
}
5.2.1、可以做页面跳转

服务器端页面跳转

代码语言:javascript复制
request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request, 
response);
5.2.2、重定向

客户端页面跳转

代码语言:javascript复制
response.sendRedirect("index")
5.2.3、json数据

将json数据打印到浏览器

代码语言:javascript复制
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");

5.3、返回值为:ModelAndView

ModelAndView是由Spring提供的对象,他里面存储了视图名称或视图对象以及一些模型属性。

ModelAndView中的常用方法:

代码语言:javascript复制
//
//页面上可以直接获取:${attributeValue}
public ModelAndView addObject(String attributeName, @Nullable Object attributeValue) {
        this.getModelMap().addAttribute(attributeName, attributeValue);
        return this;
    }
//用于设置视图名称,视图解析器会根据名称前往指定的视图
public void setViewName(@Nullable String viewName) {
        this.view = viewName;
}
5.3.1、需求

完成用户名、密码输入后登录

5.3.2、登录页面

/pages/login.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
    用户名:<input type="text" name="uname"/>
    密码:<input type="password" name="pword"/>
    <input type="submit" value="登录"/>
    <label>${error}</label>
</form>
</body>
</html>
5.3.3、登录控制器

LoginController.java

代码语言:javascript复制
import com.tyschool.smvc002.javabean.Manager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
    @RequestMapping("/login")
    public ModelAndView loginManager(Manager m){
        ModelAndView modelAndView=new ModelAndView();
        if("admin".equals(m.getUname())&&"admin".equals(m.getPword())){
            modelAndView.addObject("uname",m.getUname());
            modelAndView.setViewName("win");
        }else{
            modelAndView.addObject("error","用户名密码错误");
            modelAndView.setViewName("login");
        }
        return modelAndView;
    }
}
5.3.4、登录成功页面

/pages/win.jsp

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功!</title>
</head>
<body>
登录成功!${uname}
</body>
</html>

6、转发与重定向

6.1、forward转发

代码语言:javascript复制
//视图解析器产生地址
@RequestMapping("/testFind1")
public String findBy1(@ModelAttribute("m1")Manager m){
        System.out.println(m);
        return "index";
}
//用forward后,需要写入实际地址
@RequestMapping("/testForward")
public String testForward(){
        return "forward:/pages/index.jsp";
}

注意:

foward相当于request.getRequestDispatcher(“url”).forward(request,response),服务器端跳转。

6.2、Redirect重定向

代码语言:javascript复制
@RequestMapping("/testForward")
public String testForward(){
        return "forward:/pages/index.jsp";
}
@RequestMapping("/testRedirect")
public String testRedirect(){
        System.out.println("执行了1。。。。。。。");
        return "redirect:testForward";
}
@RequestMapping("/testRedirect1")
public String testRedirect1(){
        System.out.println("执行了2。。。。。。。");
        return "redirect:/pages/index.jsp";
}

注意:

redirect相当于response.sendRedirect(url),客户端跳转。

重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。

7、JSON数据响应

7.1、@ResponseBody

将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端

7.2、导入对应的jar包

Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入jackson 的包。

pom.xml

代码语言:javascript复制
<jackson.version>2.10.1</jackson.version>  

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>

7.3、案例

7.3.1、加入配置

springmvc.xml

代码语言:javascript复制
<mvc:annotation-driven />

<mvc:annotation-driven />会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean

AnnotationMethodHandlerAdapter将会初始化7个转换器

代码语言:javascript复制
ByteArrayHttpMessageConverter 
StringHttpMessageConverter 
ResourceHttpMessageConverter 
SourceHttpMessageConverter 
XmlAwareFormHttpMessageConverter 
Jaxb2RootElementHttpMessageConverter 
MappingJacksonHttpMessageConverter

对于json的解析就是通过MappingJacksonHttpMessageConverter转换器完成的。

7.3.2、JsonController.java
代码语言:javascript复制
import com.tyschool.smvc002.javabean.Manager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller("jsonController")
public class JsonController {
    @RequestMapping(value="/testJson",method = RequestMethod.POST, consumes = "application/json")
    public @ResponseBody Manager testJsonOne(@RequestBody Manager m){
        System.out.println("12321321");
        System.out.println(m);
        return m;
    }
}
7.3.3、index.jsp
代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#testJsonClick").click(function(){
                $.ajax({
                    type:"post",
                    url:"testJson",
                    contentType:"application/json;charset=utf-8",
                    data:'{"mid":1,"uname":"zhangsan","pword":"123456"}',
                    dataType:"json",
                    success:function(data){
                        console.log(data);
                    }
                });
            });
        })
    </script>
</head>
<body>
<button id="testJsonClick">单击</button>
</body>
</html>

0 人点赞