SpringMVC(二)SpringMVC处理Web请求、获取返回值

一、注解

  • @Controller

作用:用于创建控制器对象。该对象能够处理Web请求。

位置:该注解位于类名上方。

@Controller
public class MyController {
   }
  • @RequestMapping

作用:请求映射,用于将指定请求绑定到指定方法上,该方法用于处理对应请求。

属性:value:设置请求的url,值唯一;method:设置提交请求的方式(取值为get/post)

位置:该注解位于方法名上方。

@RequestMapping(value = "/some.do", method = RequestMethod.GET)
public ModelAndView doSome(){
   }

二、视图解析器

  视图解析器用于简化指定返回视图的操作,直接使用文件名即可——modelAndView.setViewName("文件名称")

prefix:文件路径前缀

suffix:文件后缀名,例如:".jsp"

<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀:视图文件路径-->
    <property name="prefix" value="/WEB-INF/view/"/>
    <!--后缀:视图文件扩展名-->
    <property name="suffix" value=".jsp"/>
</bean>

转发路径:"/WEB-INF/view/" + “文件名称” + “.jsp”

三、接收参数

  1. 直接在处理器方法中获取

    在处理器方法的参数中加入HttpServletRequest、HttpServletResponse、HttpSession三个参数。

@RequestMapping(value = "/return-view.do")
public String returnView(HttpServletRequest request, HttpServletResponse response, HttpSession session){
   
    //可以手工在request域中加入参数
    request.setAttribute("name",name);
    request.setAttribute("age",age);
    return "show";
}
  1. 接收简单类型参数

    表单中代码:

<h1>请输入姓名和年龄:</h1><br>
<form action="receiveproperty.do" method="post">
    姓名:<input type="text" name="name"><br><br>
    年龄:<input type="text" name="age"><br><br>
    <input type="submit" value="提交"><br>
</form>

参数名相同时:在处理器方法中加入与表单参数名称和个数相同的参数。

@RequestMapping(value = "/receiveproperty.do")
public ModelAndView doSome(String name, Integer age){
   
    ModelAndView mv = new ModelAndView();
    mv.addObject("myName",name);
    mv.addObject("myAge",age);
    mv.setViewName("show");
    return mv;
}

与表单参数名不同时:在处理器方法中加入相同个数的参数;在对应参数前使用@RequestParam(value = “与表单参数名相同的参数名”),即可将参数赋给对应变量。

<h1>表单中参数名与控制器方法中的参数名不一致时</h1><br>
<form action="receiveparam.do" method="post">
    姓名:<input type="text" name="rname"><br><br>
    年龄:<input type="text" name="rage"><br><br>
    <input type="submit" value="提交"><br>
</form>
@RequestMapping(value = "/receiveparam.do")
public ModelAndView receiveparam(@RequestParam(value = "rname") String name,
                                 @RequestParam(value = "rage") Integer age){
   
    System.out.println("name:"+name+" age:"+age);
    ModelAndView mv = new ModelAndView();
    mv.addObject("myName",name);
    mv.addObject("myAge",age);
    mv.setViewName("show");
    return mv;
}
  1. 接收引用类型参数
<h1>使用java对象接收参数</h1><br>
<form action="receiveObj.do" method="post">
    姓名:<input type="text" name="name"><br><br>
    年龄:<input type="text" name="age"><br><br>
    <input type="submit" value="提交"><br>
</form>

Student对象:

public class Student {
   
    private String name;
    private Integer age;

    public Student() {
           System.out.println("执行了Student无参数构造方法");    }

    public String getName() {
           return name;    }

    public void setName(String name) {
           this.name = name;    }

    public Integer getAge() {
           return age;    }

    public void setAge(Integer age) {
           this.age = age;    }

    @Override
    public String toString() {
   
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在处理器方法中加入Student变量,表单中的参数会通过容器调用对应setXXX()方法,为对应属性赋值。

注意:表单中的参数名必须和对象中的属性名一致。

@RequestMapping(value = "/receiveObj.do")
public ModelAndView receiveObj(Student myStudent){
   
    ModelAndView mv = new ModelAndView();
    mv.addObject("myName",myStudent.getName());
    mv.addObject("myAge",myStudent.getAge());
    mv.addObject("myStudent",myStudent);
    mv.setViewName("show");
    return mv;
}
  1. 接收Map、List、数组等(与应用类型赋值相同)

三、设置参数编码

在表单提交时,通过post方式会产生中文乱码,使用过滤器解决——CharacterEncodingFilter,解决POST提交方式中文乱码问题。

在web.xml文件中注册过滤器如下:

<!--注册过虑器,解决post请求乱码问题-->
<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>
    <!--强制该对象(HttpServletRequest)使用encoding编码的值-->
    <init-param>
        <param-name>forceRequestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <!--强制该对象(HttpServletResponse)使用encoding编码的值-->
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <!-- "/*"表示所有的请求都要先通过过滤器处理 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>

四、接收返回值

  1. ModelAndView类型

    addObject()方法用于添加数据,底层使用reques.setAttribute()方法实现;

    setViewName()方法用于转发视图,底层使用forward或redirect实现。

@RequestMapping(value = "/receiveproperty.do")
public ModelAndView doSome(String name, Integer age){
   
    ModelAndView mv = new ModelAndView();
    mv.addObject("myName",name);
    mv.addObject("myAge",age);
    mv.setViewName("show");
    return mv;
}
  1. void类型

void类型通常配合ajax使用。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>发送请求</title>
    <script type="text/javascript" src="js/jQuery-3.5.1.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#bt").click(function () {
                $.ajax({
                    url:"returnVoid-ajax.do",
                    data:{
                        name:"zhangsan",
                        age:20
                    },
                    type:"post",
                    dataType:"text",
                    success(resp){
                        //resp是从服务器返回的json格式的字符串,{name:"zhangsan",age:"20"}
                        //jQuery会把字符转化为json对象,赋值给resp
                        alert(resp.name+"    "+resp.age)
                    }
                })
            })
        })
    </script>
</head>
<body>
    <button id="bt">发起Ajax请求</button>
</body>
</html>
@RequestMapping(value = "/returnVoid-ajax.do")
public void returnVoid(HttpServletResponse response,String name, Integer age) throws IOException {
   
    Student student = new Student();
    student.setName(name);
    student.setAge(age);

    //转化为json格式
    String json = "";
    if (student!=null){
   
        ObjectMapper om = new ObjectMapper();
        json = om.writeValueAsString(student);
        System.out.println("student转换为json:"+json);
    }

    //输出数据,响应json请求
    response.setContentType("application/json;charset=utf-8");
    PrintWriter out = response.getWriter();
    out.println(json);
    out.flush();
    out.close();
}
  1. String类型

    表示数据:

    返回值是String类型,表示数据,此时含有@ResponseBody注解

    默认编码为:text/plain;charset=ISO-8859-1,会出现中文乱码,使用produces更改编码

@RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=UTF-8")
@ResponseBody
public String returnStringData(String name, Integer age){
   
    return "Hello SpringMVC ========奥利奥";
}

  表示视图:

  理器方法返回String(表示视图,此时没有@ResponseBody注解)——表示逻辑视图名称,需要配置视图解析器

  当返回值是视图完整路径时需要取消视图解析器,因为视图解析器会进行字符拼接。

@RequestMapping(value = "/return-view.do")
public String returnView(HttpServletRequest request, String name, Integer age){
   
    System.out.println("name:"+name+" age:"+age);
    //可以手工在request域中加入参数
    request.setAttribute("name",name);
    request.setAttribute("age",age);
    return "show";
}
  1. Object类型

    使用Ajax时主要使用json数据类型
    <mvc:annotation-driven />:注解驱动,能够将java对象转化为json、xml、二进制等数据类型
    @ResponseBody注解:放到处理器方法上面
    处理器将对象转化为json后,在内部通过HttpServletResponse输出数据,相应Ajax请求

@RequestMapping(value = "/returnStudentObject.do")
@ResponseBody
public Student returnStudentObject(String name, Integer age){
   
    Student student = new Student();
    student.setName("lisi");
    student.setAge(23);
    return student;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务