阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

SpringMVC常用操作

109次阅读
没有评论

共计 16010 个字符,预计需要花费 41 分钟才能阅读完成。

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>

注意:

SpringMVC 常用操作

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>

注意:

SpringMVC 常用操作

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>

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-06-06发表,共计16010字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中