SpringMVC框架从入门到入土

SpringMVC框架从入门到入土,第1张

SpringMVC框架从入门到入土(二):教你掌握SpringMVC的注解式开发 @RequestMapping的使用
  • 放在类的上面
/**
 * @RequestMapping
 * value:所有请求地址的公共部分,叫做模块名称
 * 位置:放在类的上面
 */
@RequestMapping("/test")
public class MyController {
  xxxxxx
}
  • 指定请求的方式
    /**
     * @RequestMapping :请求映射
     * 属性:method,表示请求的方式。它的值RequestMethod类枚举值。
     * 例如:get请求方式,ReqMethod.GET
     * post方式,RequestMethod.POST
     * @return
     */
    @RequestMapping(value = "/some.do",method = RequestMethod.GET)
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc开发");
        mv.addObject("fun","执行的是doSome方法");
        mv.setViewName("show");
        return mv;
    }

    /**
     * 指定other.do是post请求方式
     */
    @RequestMapping(value = "/other.do",method = RequestMethod.POST)
    public ModelAndView doOther(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc开发");
        mv.addObject("fun","执行的是doOther方法");
        mv.setViewName("show");
        return mv;
    }

发起some请求


处理器方法的参数 处理器方法形参
  • HttpServletRequest
  • HttpServletResponse
  • HttpSession

以上三类会在系统调用时由系统自动赋值,即程序员可以在方法内直接使用。

public ModelAndView doOther(HttpServletRequest request, HttpServletResponse resp, HttpSession session){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc开发" + + request.getParameter("name"));
        mv.setViewName("show");
        return mv;
    }
逐个接收参数
  • 逐个接收

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    接收参数


提交参数给Controller

姓名:
年龄:

 /**
     * 逐个接收请求参数
     * 要求:处理器(控制器)方法的形参名和请求中的参数名必须一致
     *      同名的请求参数赋值给同名的形参
     *  框架接收请求参数:
     *  1. 使用request对象接收请求参数
     *     string strName = request.getParameter( "name” );
     *     string strAge = request.getParameter( "age' );
     *  2. springmvc框架通过Dispatcherservlet调用MyController的receiveParameter()方法
     *     调用方法时,按名称对应,把接收的参数赋值给形参
     *      receiveParameter ( strName , Integer. value0f(strAge) )
     *      框架会提供类型转换的功能,能把string转为int,Long,float,double等类型。
     */
    @RequestMapping(value = "receiveProperty.do")
    public ModelAndView receiveParameter(String name,Integer age){
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("showparamter");
        return mv;
    }

注意:注意:在提交请求参数的时候get请求方式中文没有乱码。
在使用post方式请求时候,中文会有乱码,需要使用过滤器处理乱码的问题

过滤器的设置(解决中文乱码)
  • 在web.xml文件中设置

    <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>

        <init-param>
            <param-name>encodingparam-name>
            <param-value>utf-8param-value>
        init-param>
        
        <init-param>
            <param-name>forceRequestEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
        
        <init-param>
            <param-name>forceResponseEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>characterEncodingFilterfilter-name>
        
        <url-pattern>/*url-pattern>
    filter-mapping>

显示正常了!!!

校正请求参数@RequestParam
    /**
     * 请求中参数名和处理器的形参名不一样
     * @RequestParam:解决请求中参数形参名不一样的问题
     * 属性:1. value 请求中的参数名
     *      2. required 是一个boolean,默认是true
     *         true:表示请求中必须包含此参数
     * 位置:在处理器方法的形参定义的前面
     */
    @RequestMapping(value = "receiveParam.do")
    public ModelAndView receiveParam(@RequestParam(value = "rname",required = false) String name,
                                     @RequestParam(value = "rage",required = false) Integer age){
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("showparamter");
        return mv;
    }

对象接收参数
  • 创建接收参数的对象
package com.liar.entity;

/**
 * 保存请求参数的一个普通类
 * @author liar
 * @date 编写时间: 2022/4/15 0:04
 */
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 +
                '}';
    }
}
  • MyController方法
    /**
     * 处理器方法的形参是java对象,这个对象的属性名和请求参数名是一样的
     * 框架回创建形参的java对象,给属性赋值,请求中的参数是name
     * 框架会调用setName()
     */
    @RequestMapping(value = "receiveObject.do")
    public ModelAndView receiveObject(Student student){
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname",student.getName());
        mv.addObject("myage",student.getAge());
        mv.addObject("mystudent",student);
        mv.setViewName("showparamter");
        return mv;
    }
  • 对象参数名和请求参数名保持一致

测试用java对象接收请求参数

姓名:
年龄:

处理器方法的返回值

常用的有四种类型

  • ModelAndView
  • String
  • 无返回值
  • 返回自定义类型
返回ModelAndView

若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时
处理器方法返回ModelAndView比较好。当然,若要返回ModelAndView, 则处理器方法中需要定义ModelAndView对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何
资源跳转(如对页面的Ajax异步响应),此时若返回ModelAndView,则将总是有一部分多
余:要么Model多余,要么View多余。即此时返回ModelAndView将不合适。

返回String

处理器方法返回的字符串可以指定逻辑视图名,通过视图解释可以将其转换未物理视图的地址

返回内部资源逻辑视图名
若要跳转的资源为内部资源,则视图解析器可以使用InternalResourceViewResolver 内部
资源视图解析器。此时处理器方法返回的字符串就是要跳转页面的文件名去掉文件扩展名后的部分。这个字符串与视图解析器中的prefix、 suffix 相结合,即可形成要访问的URI。

    /**
     * 配置视图解释器
     * @param student
     * @return
     */
    @RequestMapping(value = "returnString-view.do")
    public String returnStringView(HttpServletRequest request,Student student){
        //可以自己手动添加数据到request作用域
        request.setAttribute("myname",student.getName());
        request.setAttribute("myage",student.getAge());
        request.setAttribute("mystudent",student);
        //showReturn:逻辑地址名称,项目中配置了视图解释器
        //框架对视图执行转发 *** 作
        return "showparamter";
    }

如果处理器方法返回String表示完整视图路径,那么此时不能配置视图解析器!

返回Void(了解)
  • 不能表示数据,也不能表示视图
  • 在处理ajax的时候。可以使用void返回值。通过HttpServletResponse输出到屏幕,响应ajax请求,ajax服务器端返回的是数据,和视图无关。

/**
     * 返回空值
     */
    @RequestMapping(value = "returnVoid-view.do")
    public void returnVoidView(HttpServletResponse response,String name,Integer age) throws IOException {
        //假设Service完成了
        Student stu = new Student(name,age);
        //把结果转换未json对象
        String json = "{}";
        if(stu != null){
            ObjectMapper om = new ObjectMapper();
             json = om.writeValueAsString(stu);
            System.out.println("syudent转换的json"+json);
        }

        //输出数据
        response.setContentType("application/json;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println(json);
        writer.flush();
        writer.close();
    }
返回Object

注解驱动的作用:

完成java对象到json,xml,text,二进制等数据格式的转换。

HttpMessageConverter:消息转换器。这个接口有很多的实现类。这些实现类完成了java对象到json,java对象到xml,java对象到二进制数据的转换。

  • canWriter的作用检查处理器方法的返回值,能不能转为var2表示的数据格式

    检查student(list,20)能不能转成var2表示的格式。

    如果可以转为json,canwriter返回True

    MediaType:表示数据的格式,比如json、xml

  • write:把处理器方法的返回值对象,调用jackson中的ObjectMapper转为字符串。

    json = om,writeValueAsString(Student)

@ResponseBody

放在处理器的上面,通过HttpServletResponse输出数据,响应ajax的请求。

实现:

  1. spring配置文件中加入注解驱动

    <mvc:annotation-driven/>
  1. 注解驱动前后对比

返回Student-Json

    /**
     * 处理器返回一个Student,通过框架转为json,响应ajax的请求
     * @ResponseBody 作用:把处理器方法返回的对象转为json后,通过HttpServletResponse输出给浏览器。
     * 位置:方法的定义上面,和其他注解顺序没有关系
     */
    @RequestMapping(value = "returnStudentJson.do")
    @ResponseBody
    public Student returnStudentJson(HttpServletResponse response,String name,Integer age){
        //调用service,获取请求结果数据,student对象表示结果数据
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
        return student;
    }
返回字符串对象

若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但若返回的字符串中带有中文字符,则接收方页面将会出现乱码。此时需要使用@RequestMapping的produces属性指定字符集。
produces,产品,结果,即该属性用于设置输出结果类型。

    /**
     * 处理器方法返回的是String,String表示数据,不是视图
     * 区分返回值是String数据还是视图要看有没有@ResponseBody注解
     * 如果有@ResponseBody注解,返回String就是数据,反之就是视图
     */
    @RequestMapping(value = "returnStringData.do",produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doObject(String name,Integer age){
        return "ZXW ,我爱你!";
    }
访问静态资源

tomcat本身就能处理静态资源的访问,像html,图片,js文件都是静态资源

<servlet-mapping>
        <servlet-name>springmvcservlet-name>
        
        <url-pattern>/url-pattern>
    servlet-mapping>
使用default-servlet-handler


    <mvc:default-servlet-handler/>
使用resources(掌握)






    <mv:resources mapping="/images/**" location="/images/"/>
    <mv:resources mapping="/html/**" location="/html/"/>
    <mv:resources mapping="/js/**" location="/js/"/>

改进:在webapp目录下新建一个目录static

    <mv:resources mapping="/static/**" location="/static/"/>
绝对路径和相对路径

在jsp、html中使用的地址,都是在前端页面中的地址,都是相对地址

地址分类:

  • 绝对地址:带有协议名称的是绝对地址
  • 相对地址:没有协议开头的,必须有一个参考地址,通过参考地址+相对地址本身才能指定资源

参考地址:


获取页面路径:

<%
     String basePath = request.getScheme() +""+
            request.getServerName() + ":" + request.getServerPort() +
            request.getContextPath() + "/";
%>

指定base标签:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/726394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存