组团学

SpringMVC常用操作

阅读 (124264)

1、springMVC常用注解-01

1.1、新建springmvc项目

1.1.1、创建新项目

通过maven创建一个新项目smvc002

1.1.2、导包

pom.xml

<?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

<?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

<?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

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 执行成功!!!! </body> </html>

创建:TestController.java

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

<%@ 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

@RequestMapping("/testBody") public String testRequestBody(@RequestBody(required = false) String body){ System.out.println(body); return "index"; }

创建:index.jsp

<%@ 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

@RequestMapping("/testPath/{mid}") public String testPathVariable(@PathVariable("mid") Integer mid){ System.out.println(mid); return "index"; }

创建:index.jsp

<%@ 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

@RequestMapping("/testHeader") public String testRequestHeader(@RequestHeader(value="Accept-Language",required = false) String header){ System.out.println(header); return "index"; }

创建:index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <a href="testHeader">RequestHeader 注解</a> </body> </html>

注意:

image20200511162048493.png

3、springMVC常用注解-03

3.1、CookieValue

3.1.1、作用

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

3.1.2、属性

value:指定 cookie 的名称。

required:是否必须有此 cookie。

3.1.3、案例

创建:TestController.java

@RequestMapping("/testCookie") public String testCookieValue(@CookieValue(value="JSESSIONID",required = false) String cookie){ System.out.println(cookie); return "index"; }

创建:index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <a href="testCookie">CookieValue 注解</a> </body> </html>

注意:

image20200511164216649.png

3.2、SessionAttribute

3.2.1、作用

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

3.2.2、属性

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

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

3.2.3、案例

需求:

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

创建:TestController.java

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

<%@ 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

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

@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

<%@ 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

//查询数据库操作 @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

<%@ 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

@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

<%@ 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

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

@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对象的控制器中。

@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、可以做页面跳转

服务器端页面跳转

request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request, response);

5.2.2、重定向

客户端页面跳转

response.sendRedirect("index")

5.2.3、json数据

将json数据打印到浏览器

response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json 串");

5.3、返回值为:ModelAndView

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

ModelAndView中的常用方法:

// //页面上可以直接获取:${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

<%@ 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

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录成功!</title> </head> <body> 登录成功!${uname} </body> </html>

6、转发与重定向

6.1、forward转发

//视图解析器产生地址 @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重定向

@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

<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

<mvc:annotation-driven />

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

AnnotationMethodHandlerAdapter将会初始化7个转换器

ByteArrayHttpMessageConverter StringHttpMessageConverter ResourceHttpMessageConverter SourceHttpMessageConverter XmlAwareFormHttpMessageConverter Jaxb2RootElementHttpMessageConverter MappingJacksonHttpMessageConverter

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

7.3.2、JsonController.java

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

<%@ 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>
需要 登录 才可以提问哦