y以下案例均部署在Tomcat上,使用浏览器来访问一个简单的success.jsp页面来实现
**Success.jsp页面代码**
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <H1>Success</H1> </body> </html>
**1.页面跳转**
直接返回字符串
返回Model与View模型
**2.回写数据**
直接返回字符串
返回对象或集合
**在spring-mvc.xml中配置内部视图资源解析器**
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/web/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property></bean>
**1.1 直接返回字符串**
**这个比较简单**
@Controlle public class Usercontroller { @RequestMapping(value = "/quick2") public String save2(){ System.out.println("Controller save running!!"); return "/success.jsp"; } }
**结果**
**1.2返回Model与View模型**
**方法一**
@Controlle public class Usercontroller { @RequestMapping(value = "/quick3") public ModelAndView save3(){ /\*创建Modelandview对象\*/ /\* \* model模型用于封装数据 \* view模型用于展示数据 \* \*/ ModelAndView modelAndView = new ModelAndView(); /\*进行数据封装\*/ modelAndView.addObject("Data","This is data" ); /\*设置视图名称\*/ modelAndView.setViewName("success"); /\*直接返回model and View\*/ return modelAndView; } }
**success.jsp页面代码**
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--获取model封装的数据--%> <H1>Success ${Data}</H1> </body> </html>
**页面效果**
**方法二**
**由Spring框架来给我们自动注入**
这个方法与前一个方法的区别就是不用我们自己来创建ModelandView对象,Spring框架会给我们自动注入
@Controlle public class Usercontroller { @RequestMapping(value = "/quick4") public ModelAndView save4(ModelAndView modelAndView){ /\*进行数据封装\*/ modelAndView.addObject("Data","This is data" ); /\*设置视图名称\*/ modelAndView.setViewName("success"); /\*直接返回model and View\*/ return modelAndView; } }
**方法三**
**直接使用原生的HttpServletRequest对象**
@Controlle public class Usercontroller { @RequestMapping(value = "/quick5") public String save4(HttpServletRequest request){ /\*进行数据封装\*/ request.setAttribute("Data","This is data"); return "success"; } }
**1.3回写字符串不进行跳转**
**方法一**:通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,
@Controlle public class Usercontroller { @RequestMapping(value = "/quick6") public void save6(HttpServletResponse response) throws IOException { response.getWriter().println("This is save write"); } }
**方法二**:将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回
@Controlle public class Usercontroller { @RequestMapping(value = "/quick6") /\*告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save6(HttpServletResponse response) throws IOException { return "This is save write"; } }
结果:
**4.使用json格式回写字符串**
手动拼接json格式字符串的方式很麻烦,开发中往往要将复杂的java对象转换成json格式的字符串,我们可以使用web阶段学习过的json转换工具jackson进行转换,通过jackson转换json格式字符串,回写字符串
@Controlle public class Usercontroller { @RequestMapping(value = "/quick7") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public String save7() throws IOException { User user = new User(); user.setAge(11); user.setName("Lisi"); //使用jason转换工具将对象转换为json格式 ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); return json; } }
**5.SpringMVC的数据响应-回写数据-返回对象或集合**
**使用配置文件方式**
**在spring-mvc.XML中经行如下配置**
<bean class="org.springframework.web.servlet.mvc.method.annotation .RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json .MappingJackson2HttpMessageConverter"> </bean> </list> </property> </bean>
@RequestMapping("/quick8") @ResponseBodypublic User quickMethod8() throws IOException { User user = new User(); user.setUsername("zhangsan"); user.setAge(18); return user;}
**使用注解方式**
在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc的注解驱动代替上述配置。
<!--mvc的注解驱动--><mvc:annotation-driven/>
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用<mvc:annotation-driven>自动加载 RequestMappingHandlerMapping(处理映射器)和
RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用
<mvc:annotation-driven>替代注解处理器和适配器的配置。
同时使用<mvc:annotation-driven>默认底层就会集成jackson进行对象或集合的json格式字符串的转换。
**客户端请求参数的格式是**:name=value&name=value… …
**服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数**:
基本类型参数
POJO类型参数
数组类型参数
集合类型参数
**
**:
业务方法的参数名称要与请求参数的名称一致,参数数值会自动进行映射匹配
**案例:**
访问url:http://localhost:8080/spring/quick8?username=zhangsan&age=14
**业务方法代码**
@RequestMapping(value = "/quick8") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save8(String username,int age) throws IOException { System.out.println(username); System.out.println(age); }
**服务端输出**
**成功获取到请求参数**
**
**
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配,即自动封装到一个实体类当中
**访问的url路径**:http://localhost:8080/spring/quick8?username=zhangsan&age=14
**实体类代码**
package com.pjh.User; public class User { private int age; private String name; public User() { } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\'' + '}'; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
**Controller类代码中的业务方法代码**
@RequestMapping(value = "/quick9") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save9(User user) throws IOException { System.out.println(user); }
**服务器端输出**
**数组类型参数**
Controller中的业务方法的参数名称要与请求参数的name一致,参数会自动映射匹配
**示例**
**访问的url**:http://localhost:8080/spring/quick10?str=aaa&str=bbb&str=ccc
**Controller中的业务方法代码**
@RequestMapping(value = "/quick10") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save10(String [] str) throws IOException { System.out.println(Arrays.asList(str)); }
**服务端输出**
**
**
获取集合参数时要将集合参数封装到一个POJO中
**以一个提交表单的案例来演示**
**jsp页面用户提交数据**
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/quick11" method="post"> <input type="text" name="userList[0].username"><br> <input type="text" name="userList[0].age"><br> <input type="text" name="userList[1].username"><br> <input type="text" name="userList[1].age"><br> <input type="submit" value="提交表单"> </form> </body> </html>
**user类代码**
package com.pjh.User; public class User { private int age; private String username; @Override public String toString() { return "User{" + "age=" + age + ", username='" + username + '\'' + '}'; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
**封装List<user>的vo类代码**
package com.pjh.User; import java.util.List; public class VO { private List<User> userList; @Override public String toString() { return "VO{" + "userList=" + userList + '}'; } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } }
**Controller中的业务方法**
@RequestMapping(value = "/quick11") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save11(VO vo) throws IOException { System.out.println(vo); }
**在浏览器中提交的信息**
**客户端输出**
**
**
**配置的代码**
<!--配置过滤器来进行编码的过滤--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--配置参数即编码类型--> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--在任何访问的时候都进行过滤--> <url-pattern>/\*</url-pattern> </filter-mapping>
**
**
**未过滤前**
**过滤后**
**controller类中的业务方法代码**
@RequestMapping(value = "/quick13") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save13(@RequestBody List<User> userList) throws IOException { System.out.println(userList); }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <%--这里使用的是字节跳动jquery压缩版引用地址: (速度快推荐!)--%> <script src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js"></script> <script> var array = new Array(); array.push({username:"zhangsan",age:"14"}); array.push({username:"lisi",age:"12"}); $.ajax({ type:"POST", url:"${pageContext.request.contextPath}/quick13", data:JSON.stringify(array), contentType:'application/json;charset=utf-8' }); </script> </head> <body> <h1>ajax2</h1> </body> </html>
**如果你想用其他版本的jquery,可以点击下面的网址寻找**:https://www.jq22.com/jquery-info122
**如果你的的script没用跳转到指定的业务方法,很大程度可能是因为jquery的问题,可以使用谷歌的开发者工具看看,状态显示200才是成功跳转了**
**当有静态资源需要加载时,比如jquery文件,如果你SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种方式指定放行静态资源:**
**方法二:在spring-mvc.xml配置文件中指定放行的资源**
<mvc:resources mapping="/js/\*\*" location="/js/"/>
**方法1:这是让tomcat来帮我们找文件**
<mvc:default-servlet-handler/>
**
**
注解@RequestParam还有如下参数可以使用:
value:与请求参数名称一致,配置了这个的 时候方法中的参数名可以随意配置,不需要与请求参数的名称一致
required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
**示例**
@ResponseBody public void save14(@RequestParam(value = "name" ,required = false,defaultValue = "王五") String username) throws IOException { System.out.println(username); }
**
**
Restful是一种架构风格是一种设计风格,而不是一种标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等
**Restful风格的请求是使用“url+请求方式”表示一次请求目的的**,HTTP 协议里面四个表示操作方式的动词如下:
**GET**:用于获取资源
**POST**:用于新建资源
**PUT**:用于更新资源
**DELETE**:用于删除资源
**例如**:
/user/1 GET : 得到 id = 1 的 use
/user/1 DELETE: 删除 id = 1 的 use
/user/1 PUT: 更新 id = 1 的 use
/user POST: 新增 use
**获取restful风格的参数**
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作
@RequestMapping(value = "/quick15/{name}") /\* 告诉SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回\*/ @ResponseBody public void save15(@PathVariable(value = "name" ,required = false) String username) throws IOException { System.out.println(username); }
**上述代码中的{name}就是占位符,@PathVariable注解中的value值要和占位符里的名称一样**
**
**
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
自定义类型转换器的开发步骤:
1.定义转换器类实现Converter接口
2.在配置文件中声明转换器
3.在<annotation-driven>中引用转换器
1.定义转换器类实现Converter接口
package com.pjh.Converter; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DataConvert implements Converter<String, Date> { public Date convert(String source) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date parse = null; try { parse = simpleDateFormat.parse(source); } catch (ParseException e) { e.printStackTrace(); } return parse; } }
2.在配置文件中声明转换器
<bean id="ConversionServiceConverter" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.pjh.Converter.DataConvert"/> </list> </property> </bean>
3.在<annotation-driven>中引用转换器
<mvc:annotation-driven conversion-service="ConversionServiceConverter"/>
**
**
使用@CookieValue可以获得指定Cookie的值
@CookieValue注解的属性如下:
value:指定cookie的名称
required:是否必须携带此cookie
**获取Cookie,有专门注解**
RequestMapping("/quick18") @ResponseBody public void quickMethod18( @CookieValue(value = "JSESSIONID",required = false) String jsessionid) { System.out.println(jsessionid); }
**获取User-Agent没有**
@RequestMapping("/quick17") @ResponseBody public void quickMethod17( @RequestHeader(value = "User-Agent",required = false) String headerValue) { System.out.println(headerValue); }
原创声明,本文系作者授权云+社区发表,未经许可,不得转载。
如有侵权,请联系 yunjia_community@tencent.com 删除。
我来说两句