SpringMVC使用

Spring实现步骤

  • 新建web maven工厂
  • 加入依赖
    spring-mvc依赖,间接把spring的依赖都加入到项目
    jsp,servlet依赖
  • 重点:在web.xml注册springmvc框架的核心对象DispatcherServlet
    1.DispatherServlet:中央调度器是一个servlet,父类是HttpServlet
    2.DispatherServlet:也叫前端控制器
    3.DispatherServlet:负责接受请求,调用其他控制器对象,并把请求返回给用户。
    4.创建一个发起请求的页面 index.jsp
    5.创建控制器类
    - 1. 在类上面加入@Controller注解,创建对象,并放入到springmvc容器中。
    - 2. 在类中的方法上面加入@RequestMapping注解
    6.创建一个作为结果的jsp,显示请求的处理结果。
    7.创建springmvc的配置文件(spring的配置文件一模一样)
    - 1.声明组件扫描器,指定@Controller注解所在的包名。
    - 2.声明视图解析器,帮组处理视图的。

springmvc 配置

  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--    注册springMVC的核心对象DispatherServlet-->
<!--    需要在tomcat服务器启动后创DispatherServlet实例-->
<!--    为什么要创建DispatherServlet对象的实例呢
       通过DispatherServlet在他创建过程中,会同时创建springmvc容器对象
       读取springmvc的配置文件,吧这个配置文件中的对象都创建好,当用户发起请求
       就可直接使用对象了
       servlet的初始化会执行init()方法.DispatherServlet在init()中
       创建容器 读取配置文件
       WebApplicationContext ctx = new ClassPathXmlApplicationContext("SpringMVC.xml");
       // 把容器对象放入ServletContext中
       getServletContext().setAttribute(key, ctx);


      报错: /WEB-INF/springmvc-servlet.xml
               /WEB-INF/myWeb-servlet.xml
               原因是: springmvc在创建容器对象时
               默认读取的是/WEB-INF/<servlet-name>-servlet.xml
    -->
    <servlet>
        <servlet-name>myWeb</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--        自定义springmvc配置文件的位置-->
        <init-param>
            <!--            springmvc的配置文件的位置的属性-->
            <param-name>contextConfigLocation</param-name>
            <!--            指定自定义文件的位置-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
<!--        在tomcat启动后,创建servlet对象
            load-on-startup: 表示tomcat启动后创建对象的顺序
            它的值士整数,数值越小,tomcat创建对象的时间越早。
            大于等于0的整数
-->
        <load-on-startup>1</load-on-startup>

    </servlet>
    <servlet-mapping>
        <servlet-name>myWeb</servlet-name>
<!--        使用框架的时候,url-pattern可以使用两种方式-->
<!--        1. 使用扩展名, 使用*.xx , xxx是自定义的扩展名。-->
<!--        常用*.do 等等
            2. 使用斜杠 */
-->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

  • resrouce/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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    声明组件扫描器-->
    <context:component-scan base-package="com.study.controller"/>
    <!--    声明 springmvc框架中的视图解析器, 帮助开发人员设置视图文件的路径、-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--        前缀: 视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!--        后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

  • Controller类
/**
 *  表示一个控制器对象
 *  位置在类上面
 *  和spring中讲的@Service, @Component一样
 */

@Controller
public class MyController {
    /**
     *  处理用户提交的请求,springmvc是用方法来处理的
     *  方法是自定义的,可以有多种返回值,多种参数, 方法名自定义
     */
    /**
     * @RequestMapping 请求映射
     *              作用: 把一个请求和一个方法绑定在一起
     *              属性: 1. value是一个String, 表示url地址的(some.do)
     *                      value 的值必须是唯一的, 不能重复. 在使用时, 推荐地时以"/"
     *              说明: 使用RequestMapping修饰的方法叫做处理器方法,或者说控制器方法。
     *              类似于servlet的doGet, doPost.
     *              返回值: ModelAndView
     *              Model:要显示给用户的数据
     *              View : 返回jsp等.
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView dosome(){   // doGet()
        ModelAndView mv = new ModelAndView();
//        添加数据 , 框架最后吧数据放入request作用域
//        request.setAttribute("fun","执行完成");
        mv.addObject("msg", "欢迎使用springmvc");
        mv.addObject("fun", "执行dosmome方法");
        // 指定视图
        // 框架对视图执行的是forward.
        mv.setViewName("/show.jsp");
        return mv;
    }
}

  • spring.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.lz.controller"/>
</beans>
  • view层 show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>show.jsp</h3>
    <p>msg数据:${requestScope.msg}</p>
    <p>fun数据:${requestScope.fun}</p>
</body>
</html>

springmvc的处理流程:

  • 用户发起请求 -> tomcat -> tomcat读取web.xml更具映射规则*.do给中央调度器DispatherServlet(根据springmvc.xml配置文件 知道some.do - > dosome()方法)- >DispatherServlet吧some.do装法给MyController.dosome() - > 方法返回ModelAndView


  • 如何访问WEB-INF/view目录下的jsp或者其他页面
    即保证了用户直接访问,又解决的无法转发的问题。

   mv.setViewName("/WEB-INF/view/show.jsp");
  • 视图解析器:


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

@Controller
public class MyController {
    /**
     *  处理用户提交的请求,springmvc是用方法来处理的
     *  方法是自定义的,可以有多种返回值,多种参数, 方法名自定义
     */
    /**
     * @RequestMapping 请求映射
     *              作用: 把一个请求和一个方法绑定在一起
     *              属性: 1. value是一个String, 表示url地址的(some.do)
     *                      value 的值必须是唯一的, 不能重复. 在使用时, 推荐地时以"/"
     *              说明: 使用RequestMapping修饰的方法叫做处理器方法,或者说控制器方法。
     *              类似于servlet的doGet, doPost.
     *              返回值: ModelAndView
     *              Model:要显示给用户的数据
     *              View : 返回jsp等.
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView dosome(){   // doGet()
        ModelAndView mv = new ModelAndView();
//        添加数据 , 框架最后吧数据放入request作用域
//        request.setAttribute("fun","执行完成");
        mv.addObject("msg", "欢迎使用springmvc");
        mv.addObject("fun", "执行dosmome方法");
        // 指定视图
        // 框架对视图执行的是forward.
//        mv.setViewName("/WEB-INF/view/show.jsp");
//        配置了视图解析器后用逻辑名称指定视图
//        框架自动把前缀和逻辑名称和视图进行字符串拼接

        mv.setViewName("show");
        return mv;
    }
}

  • controller
    @RequestMapping(value = {"/some.do","/second.do"})

@RequestMapping("")可以定义在类上把公共的部分放在类上。形成层级例如 /first/metod.do

RequestMapping() Method属性

  • 控制请求方式
  //使用的是枚举形式
   @RequestMapping(value = "/some.do", method = RequestMethod.POST)

如果没有设置则什么形式的访问都行

接受前台数据

 // 接受前端参数
    @RequestMapping(value = "/first.do")
    public ModelAndView doFirst(HttpServletRequest req,
                                HttpServletResponse resp,
                                HttpSession session){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", req.getParameter("name"));
        mv.setViewName("other");
        return mv;
    }

逐个接受form表单

  <form action="properties.do" method="post">
        姓名: <input type="text" name="name">
        年龄: <input type="text" name="age">
        <input type="submit" value="提交参数">
    </form>

 // 逐个接受    需要方法参数与请求名字一一对应 并且一样
    @RequestMapping(value = "properties.do")
    /**
     *  框架会提供类型转型功能,能把String 转换为 int float double类型
     */
    public ModelAndView proper(String name, int age){
        ModelAndView mv = new ModelAndView();
        mv.addObject("myAge", age);
        mv.addObject("myName", name);
        mv.setViewName("properties");
        return mv;
    }
}
int 换成 Integer更好 容错 也可以全部写String
  • post方式请求 解决乱码
    get请求没有乱码 post请求会有中文乱码
1.  在每个方法前面加Request.getCharacterEncoding("utf-8");
2. 使用过滤器解决
  • web.xml 过滤器解决乱码问题
<!--    注册过滤器, 解决乱码问题-->
    <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>
<!--        强制请求对象使用上面的编码格式-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
<!--        强制应答对象使用上面编码格式-->
        <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>

@RequestMapping

  • 请求参数和处理器方法的形参名不一样时用

解决请求中参数名形参名不一样的问题
属性 :
1.value 请求中参数名称
2.required 是一个boolean,默认是true
true标识请求中必须包含此参数
false参数可以有也可以没有(必须有时,不传参数会报400错误)
位置:在处理器方法

    @RequestMapping(value = "haha.do")
    public ModelAndView hahaPara(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "age",required = false) Integer age){
        ModelAndView view = new ModelAndView();
        view.addObject("msg" , name);
        view.addObject("fun", age);
        view.setViewName("show");
        return view;
    }
  • 接受对象

处理器方法形参是java对象,这个对象的属性名和请求名一样的。
框架会创建形参java对象,给属性赋值。请求中的参数是name,框架会调用setName()
使用同名原则所以参数中可以有多个对象
并且没法使用RequestParam。
···
@RequestMapping(value = "object.do")
public ModelAndView objectTest(Student student){
ModelAndView mv = new ModelAndView();

    mv.addObject("msg", student.getName());
    mv.addObject("fun", student.getAge());
    mv.setViewName("show");
    return mv;
}

····

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358