SpringMVC教程2[处理及响应请求]

简介: 一、基本操作1.响应请求的方式序号 响应方式 说明1 不响应 void+@ResponseBody注解2 ModelAndView 通过setViewName方法3 直接指定响应页面 返回值为String类型,返回结果指定跳转地址4 重定向 跳转地址前加redirect:前缀即可5 HttpServletRequest和HttpServletResponse 形参中声明这两个变量。然后通过相关api跳转

 

一、基本操作

1.响应请求的方式

image.png

1.1ModelAndView

  /**
   * 查询方法
   * @return
   */
  @RequestMapping("/query")
  public ModelAndView query(){
    System.out.println("波波烤鸭:query");
    ModelAndView mv = new ModelAndView();
    mv.setViewName("/index.jsp");
    return mv;
  }

1.2返回void

返回值为void时,方法中可以不用做任何返回,例如下面代码:

@RequestMapping("/test1")
public void test1() {    
  System.out.println("test1");
}

此时,在浏览器端请求/test1接口,springmvc会默认去查找和方法同名的页面作为方法的视图返回。 如果确实不需要该方法返回页面,可以使用@ResponseBody注解,表示一个请求到此为止。

@RequestMapping("/test1")
@ResponseBody
public void test1() {    
   System.out.println("test1");
}

1.3返回一个字符串

返回一个真正的字符串

/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hello")
@ResponseBody
public String hello(){
  return "hello";
}

image.png

返回一个跳转页面名称

image.png

/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hi")
public String hello(){
  return "/index.jsp";
}

image.png

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
    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-4.3.xsd">
  <!-- 开启注解 -->
  <mvc:annotation-driven></mvc:annotation-driven>
  <!-- 开启扫描 -->
  <context:component-scan base-package="com.dpb.controller"></context:component-scan>
  <!-- 配置视图解析器 -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置响应地址的前后缀 -->
    <property name="prefix" value="/user"/>
    <property name="suffix" value=".jsp"/>
  </bean>
</beans>

响应的代码:

/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hello")
public String hello1(){
  // 视图解析器解析的时候会自动拼接上 /user 和  .jsp
  return "/hello";
}

image.png

 image.png

  /**
   * 返回一个字符串
   * @return
   */
  @RequestMapping("/delete")
  public String delete(){
    System.out.println("波波烤鸭:删除数据操作....");
    // 重定向
    return "redirect:/user/query";
  }
  /**
   * 
   * @return
   */
  @RequestMapping("/query")
  public String query(){
    System.out.println("波波烤鸭:query");
    return "/hello";
  }

image.png

返回路径注意: 返回的字符带"/“表示从根目录下开始找,不带”/"从当前目录下查找

1.4通过Request和Response对象处理

/**
 * HttpServletRequest和HttpServletResponse的使用
 * @return
 * @throws IOException 
 */
@RequestMapping("/query")
public void query(HttpServletRequest request,HttpServletResponse response) throws IOException{
  System.out.println("波波烤鸭:query");
  System.out.println(request);
  System.out.println(response);
  response.sendRedirect(request.getContextPath()+"/user/hello.jsp");
}

image.png

1.5 @RequestMapping的说明

   映射路径

   是个@RequestMapping最基本的功能,用法:

 

@RequestMapping("/delete")
 public String delete(){
  System.out.println("波波烤鸭:删除数据操作....");
  return "/hello";
 }

   窄化请求

   窄化请求用来限定请求路径,即将@RequestMapping放在类上,这样,方法的请求路径是类上的@ReqmestMapping+方法上的@RequestMapping

 image.png

   请求方法限定

image.pngimage.png

2.参数绑定

image.png

2.1基本数据类型

image.png

/**
 * 接收参数
 *    基本数据类型
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add")
public String add(int id,String name){
  System.out.println(id+"---"+name);
  return "/hello";
}

image.png

  image.png

/**
 * 接收参数
 *    基本数据类型
 *    请求参数如果和形参名称不一致可以通过@RequestParam类指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id,@RequestParam("username")String name){
  System.out.println(id+"---"+name);
  return "/hello";
}

image.png

 image.png

image.png

此时,如果不想传递该参数,需要明确指定,指定方式有两种:

   通过required属性指定该参数不是必填的

/**
 * 接收参数
 *    基本数据类型
 *    请求参数如果和形参名称不一致可以通过@RequestParam类指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id
    ,@RequestParam(value="username",required=false)String name){
  System.out.println(id+"---"+name);
  return "/hello";
}

image.png

2. 通过defaultValue属性给该参数指定一个默认值

/**
 * 接收参数
 *    基本数据类型
 *    请求参数如果和形参名称不一致可以通过@RequestParam类指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id
    ,@RequestParam(value="username",defaultValue="kaoya")String name){
  System.out.println(id+"---"+name);
  return "/hello";
}

image.png

2.2对象

2.2.1简单对象

1.创建Book对象

public class Book {
  private int id;
  private String name;
  private String author;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getAuthor() {
    return author;
  }
  public void setAuthor(String author) {
    this.author = author;
  }
}

2.设置形参为Book对象接收数据

@Controller
public class BookController {
  /**
   * 是@RequestMapping(value = "/doReg",method = RequestMethod.POST)的简写,
   * 但是@PostMaping只能出现在方法上,不能出现在类上
   * @param book
   * @return
   */
  //@RequestMapping("/add")
  @PostMapping("/add") 
  public String add(Book book){
    System.out.println(book);
    return "/index.jsp";
  }
}

3.表单传递数据

<form action="/add" method="post">
  <table>
    <tr>
      <td>编号</td>
      <td><input type="text" name="id"></td>
    </tr>
    <tr>
      <td>书名</td>
      <td><input type="text" name="name"></td>
    </tr>
    <tr>
      <td>作者</td>
      <td><input type="text" name="author"></td>
    </tr>
    <tr>
      <td><input type="submit" value="添加"></td>
    </tr>
  </table>
</form>

image.png

image.png

2.2.2包装对象

1.book对象包含Author对象

image.png

2.表单提交数据

<form action="add" method="post">
  <table>
    <tr>
      <td>编号</td>
      <td><input type="text" name="id"></td>
    </tr>
    <tr>
      <td>书名</td>
      <td><input type="text" name="name"></td>
    </tr>
    <tr>
      <td>作者年龄</td>
      <td><input type="text" name="author.age"></td>
    </tr>
    <tr>
      <td>作者姓名</td>
      <td><input type="text" name="author.name"></td>
    </tr>
    <tr>
      <td>作者性别</td>
      <td><input type="text" name="author.sex"></td>
    </tr>
    <tr>
      <td><input type="submit" value="添加"></td>
    </tr>
  </table>
</form>

image.png

3.结果

image.png

2.3数组集合类型

   数组

   表单中直接传递多个参数:

<form action="user/doReg" method="post">
  <table>
    <tr>
      <td>用户名</td>
      <td><input type="text" name="username"></td>
    </tr>
    <tr>
      <td>用户密码</td>
      <td><input type="password" name="password"></td>
    </tr>
    <tr>
      <td>兴趣爱好</td>
      <td><input type="checkbox" name="favorites" value="zuqiu">足球
        <input type="checkbox" name="favorites" value="lanqiu">篮球 <input
        type="checkbox" name="favorites" value="pingpang">乒乓球</td>
    </tr>
    <tr>
      <td><input type="submit" value="注册"></td>
    </tr>
  </table>
</form>
  @RequestMapping("/doReg") 
  public String doReg(String username
      ,String password,String[] favorites){
    System.out.println(username+"---"+password);
    for (String f : favorites) {
      System.out.println(f);
    }
    return "/index.jsp";
  }

image.png

image.png

image.png

2.集合

除了自定义参数类型转换,如果想要使用集合去接收参数,也可以将集合放到一个包装类中。

public class User {
  private String username;
  private String password;
  private List<String> favorites;
  @Override
  public String toString() {
    return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", favorites=" + favorites
        + '}';
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public List<String> getFavorites() {
    return favorites;
  }
  public void setFavorites(List<String> favorites) {
    this.favorites = favorites;
  }
}

image.png

image.png

这样,集合中也能收到传递来的参数。


image.png

2.4Date类型

接收数据类型是Date类型的需要通过转换器进行接收

  @RequestMapping("/update")
  public String update(Date d){
    System.out.println(d);
    return "/index.jsp";
  }

如果不转换直接访问提交会爆400错误

image.png

创建自定义的转换器

/**
 * 自定义转换器
 * 
 * @author dpb【波波烤鸭】
 *
 */
public class DateConvert implements Converter<String,Date>{
  @Override
  public Date convert(String msg) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    try {
      return sdf.parse(msg);
    } catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return null;
  }
}

配置转换器

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
    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-4.3.xsd">
  <!-- 开启注解 -->
  <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven>
  <!-- 开启扫描 -->
  <context:component-scan base-package="com.dpb.controller"></context:component-scan>
  <!-- 配置视图解析器 -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置响应地址的前后缀 
    <property name="prefix" value="/user"/>
    <property name="suffix" value=".jsp"/>-->
  </bean>
  <!-- 配置转换器 -->
  <bean id="formattingConversionServiceFactoryBean" 
  class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
      <set>
        <bean class="com.dpb.convert.DateConvert"/>
      </set>
    </property>
  </bean>
</beans>

image.png

image.png

3.响应数据

3.1ModelAndView

3.2HttpServletRequest

3.3HttpSession

3.4Map

  @RequestMapping("/query1")
  public String query1(Map<String,Object> map){
    map.put("msg", "map --> value");
    return "/index.jsp";
  } 

image.png

image.png

3.5Model

  @RequestMapping("/query2")
  public String query2(Model model){
    model.addAttribute("msg", "model --> value");
    return "/index.jsp";
  }

image.png

3.6ModelMap

  @RequestMapping("/query3")
  public String query3(ModelMap mm){
    mm.addAttribute("msg", "modelMap --> value");
    return "/index.jsp";
  }

image.png

注意:@SessionAttributes将数据保存在session作用域中,上面几个传值都是request作用域

image.pngimage.png

image.png

4.post方式中文乱码问题处理

在web.xml文件中添加如下代码即可

<!-- spring框架提供的字符集过滤器 -->
    <!-- spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题  -->
<filter>
   <filter-name>encodingFilter</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>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>   
相关文章
|
12月前
|
Java 测试技术 API
【SpringMVC】参数传递与用户请求和响应(上)
【SpringMVC】参数传递与用户请求和响应(上)
64 0
|
3月前
|
JSON 前端开发 Java
【JavaEE进阶】 关于Spring MVC 响应
【JavaEE进阶】 关于Spring MVC 响应
44 3
|
3月前
|
JSON Java fastjson
SpringMVC(二)【请求与响应】(2)
SpringMVC(二)【请求与响应】
|
3月前
|
JSON 前端开发 数据格式
SpringMVC的数据响应-直接回写json字符串
SpringMVC的数据响应-直接回写json字符串
|
3月前
|
前端开发 Java Spring
SpringMVC的数据响应-19
SpringMVC的数据响应-19
|
3月前
|
JSON 前端开发 Java
spring mvc 请求与响应
spring mvc 请求与响应
20 0
|
3月前
|
前端开发 Java 应用服务中间件
SpringMVC(二)【请求与响应】(1)
SpringMVC(二)【请求与响应】
|
11月前
|
JSON 前端开发 Java
构建健壮的Spring MVC应用:JSON响应与异常处理
构建健壮的Spring MVC应用:JSON响应与异常处理
49 0
|
4月前
|
JSON 前端开发 Java
SpringMVC请求和响应
Spring MVC通过请求和响应的处理来实现Web应用程序的开发。请求通过控制器处理,响应通过视图渲染器生成最终的HTML响应,并返回给客户端。
69 4
|
4月前
|
JSON 前端开发 Java
Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!
Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!