内容源自:spring mvc入门

一、spring mvc和spring的关系

spring mvc是spring框架提供的七层体系架构中的一个层,是spring框架的一部分,是spring用于处理客户端请求的MVC工具,取代表现层框架struts1/2。在使用时,spring mvc和spring框架的使用方式是相互独立的。spring mvc是脱离了spring框架的单独的表现层框架。

二、如何在web工程中添加spring mvc?

web工程添加spring框架的方式和添加springmvc的方式不同的

如果在工程中同时使用 spring框架 和 springmvc框架,需要在web.xml中同时注册两个类分别加载这两个框架

注册spring时 web.xml ContextLoaderListener 监听器

注册spring mvc框架 为了使用这个框架处理客户端请求 注册的同时为这个框架设置其需要处理的请求格式 *.do *.action *.etoak...

struts1 ActionServlet <servlet> <Servlet-mapping><url-pattern> *.do

struts2 StrutsPrepareAndExecuteFilter <filter><filter-mapping><url-pattern> *.action

注册spring框架 ContextLoaderLIstener <listener> <listener-mapper>

监听器无法为spring框架设置其需要处理的请求格式

注册spring mvc ,就需要为其设置处理的请求格式 就需要使用另外一个类代替监听器

DispatcherServlet extends HttpServlet <servlet> <servlet-mapping>

三、spring-mvc请求处理的基本流程

spring-mvc处理请求的方式 : 非注解版(2.0及之前版本)、注解版(2.5之后)

a 客户端提交hello.do请求,将请求提交到web.xml(web容器),被web容器 中注册的DIspatcherServlet拦截到;DispatcherServlet将其拦截到的所有请求转发给ioc容器中注册的请求解析器

b spring-mvc为了实现对请求的解析提供了两种请求解析器 : 字符/字节 
字符解析器提供了一个HandlerMapping接口,可以使用它提供的任何一个实现类实现对请求的解析。在该接口中,提供了两个默认的请求解析器:SimpleUrlHandlerMapping /DefaultAnnoationHandlerMapping 具体使用哪一个,取决于当前的ioc环境是否是注解环境 
将ioc环境设置为注解环境的方式 : context:component-scan 扫描包结构。 
请求解析器解析请求的方式都不一样,但是解析的结构是相同的: 
获取表示请求的字符串 “/hello”

c 根据解析的字符串,在ioc容器中查找用于处理请求的请求处理器 
[struts1=Action struts2=ActionSupport] 
spring-mvc提供的请求处理器需要实现Controller接口

1 创建一个实现了Controller接口的类作为spring-mvc的请求处理器,处理请求 
2 将其配置成ioc容器中的bean

@Controller 
使用该注解标注的类会成为ioc容器实例化的对象 
相当于手动在ioc容器中配置一个bean

提供了一个其他注解(@Compeont @Service @Repository)不具备的功能 
被该注解标注的类会自动实现Controller接口,成为spring-mvc的请求处理器。

创建一个使用@Controller注解标注的类 - 请求处理器 - 处理/hello请求

四、spring mvc表单项封装

提供一个第三方javaBean,封装请求中的表单项。将封装有表单项的javaBean添加到处理请求方法的第一个参数中。

特例 : 当提交请求中仅有一个表单项时,并且该表单项的类型为基本数据类型或者String类型 ; 表单项的封装 可以直接使用处理请求方法的第一个参数进行。而无法再提供一个javaBean。

五、中文乱码

产生原因 : 客户端( utf-8)和服务器( iso-8859-1)使用的编码不一致

解决方式 :

1 软编码

修改请求、响应中的编码格式

限制条件 : 什么情况下使用软编码无效?

1 get 2 上传、下载

在使用软编码解决中文乱码时,必须确保修改编码的位置在表单项封装之前!

2 硬编码

以新的编码方式组装一个新的字符串

spring-mvc :使用软编码方式, 重写中央控制器 DispatcherServlet

六、servlet-API交互

HttpServletRequest HttpServletResponse HttpSession ServletContext..

servlet-API范围 (request session application) 提供了类似struts2的方式,范围封装在map对象

Map map=ActionContext.getContext().get("request/session/application")

ModelMap implements Map

@SessionAttributes(String[] attrs)

该注解用于标注一个类(请求处理器)

使用该注解时,需要为其提供String类型数组

数组中指向添加到ModelMap中的数据key

将这些数据复制一份转存在session范围。

七、示例程序:

页面:

<a href="hello.do">helloworld</a>
<form action="login.do" method="post">
登录名:<input type="text" name="loginname"/><br/>
密码: <input type="password" name="password"/><br/>
     <input type="submit" value="登录"/>
</form>

web.xml: 
加载spring中央控制器并拦截 .do请求

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <!--
    注册一个web容器启动时负责加载springmvc的中央控制器:DispatcherServlet,
这里我们使用软编码的方式,重写了spring mvc提供的DispatcherServlet中的doService()方法,所以<servlet-class>值为自己写的那个类
    DispatcherServlet作用:
    1 代替ContextLoaderListener加载springmvc框架
        [spring和springmvc使用的配置文件都是 ioc容器]
    2 设置spring mvc允许处理的请求格式,防止乱码
   -->
  <servlet>
    <servlet-name>etoak</servlet-name>
    <servlet-class>com.etoak.util.MyDispatcherServlet</servlet-class>
    <!--
        如果不写<init-param>contextConfigLocation 默认值 :
            /WEB-INF/etoak-servlet.xml
     -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>etoak</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <!--
        请求解析器:
        spring-mvc中提供了两种负责解析请求的解析器:
            字符请求解析器
                HandlerMapping接口
            spring-mvc为了解析字符请求提供了两个默认的请求解析器:
                SimpleUrlHandlerMapping
                    非注解环境下默认的
                DefaultAnnotationHandlerMapping
                    注解环境下默认的
            字节请求解析器[上传请求解析器]
                MultipartResolver接口
        解析请求的方式不同,但是解析结果都是一样的:
        获取表示请求的字符串 /hello
     -->
    <context:component-scan base-package="com"/>
</beans>

HelloController.java 
处理请求

/**
 *          业务逻辑层
 *  servlet    XxServlet  com.etoak.servlet
 *  struts1/2   XxAction   com.etoak.action
 *  spring-mvc  XxController  com.etoak.controller
 */

@Controller
@SessionAttributes({"user"})
public class HelloController {

    /** "/hello"
     *  请求和处理之间的映射关系形成?
     *  @RequestMapping(path)
     *      该注解用于标注请求处理器中的一个方法;
     *      使用该方法处理path指向的请求
     */
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("处理客户端提交的hello.do请求");
        /**
         * 为客户端返回一个响应视图
         *  返回响应视图的方式 : 处理请求方法的返回值(String)
         * 返回视图的形式 : 重定向 redirect | 转发 forward
         */
        return "redirect:success.jsp";
        // return "forward:/success.jsp";
    }

    @RequestMapping("/login")
    public String login(User user){

        // 表示使用User类型的一个user对象,封装当前请求中的表单项
        /* 硬编码方式防止乱码:
        String loginname = user.getLoginname();
        try {
            loginname = new String( loginname.getBytes("iso-8859-1"), "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        */
        System.out.println("loginname-->"+user.getLoginname());
        System.out.println("password-->"+user.getPassword());
        return "forward:success.jsp";
    }

    @RequestMapping("/selectUserById")
    public String selectUserById(Integer id , ModelMap map){

        System.out.println("id-->"+id);

        User user = new User("sheldon","111");
        /** 存储在request范围中
         *  将user添加到ModelMap对象中
         *  添加到ModelMap中的数据 默认 是存储在request范围中
         */
        map.put("user", user);
        // request.setAttribute("user",user);

        return "forward:success.jsp";
    }
}

MyDispatcherServlet.java 
软编码控制编码格式:

public class MyDispatcherServlet extends DispatcherServlet {
    //软编码: 重写DispatcherServlet中的doService方法来控制请求编码格式
    @Override
    protected void doService(HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {
        // TODO Auto-generated method stub

        request.setCharacterEncoding("utf-8");

        super.doService(request, response);
    }
}

User.java

public class User {

    private String loginname;
    private String password;
    public User(String loginname, String password) {
        super();
        this.loginname = loginname;
        this.password = password;
    }
    public String getLoginname() {
        return loginname;
    }
    public void setLoginname(String loginname) {
        this.loginname = loginname;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

Spring框架学习(7)spring mvc入门的更多相关文章

  1. Spring框架学习03——Spring Bean 的详解

    1.Bean 的配置 Spring可以看做一个大型工厂,用于生产和管理Spring容器中的Bean,Spring框架支持XML和Properties两种格式的配置文件,在实际开发中常用XML格式的配置 ...

  2. Spring 框架学习(1)--Spring、Spring MVC扫盲

    纸上得来终觉浅,绝知此事要躬行 文章大纲 什么是spring 传统Java web应用架构 更强的Java Web应用架构--MVC框架 Spring--粘合式框架 spring的内涵 spring核 ...

  3. Spring框架学习02——Spring IOC 详解

    1.Spring IOC的基本概念 IOC(Inverse of Control)反转控制的概念,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理.当某个Java对象(调用者)需要调用 ...

  4. spring框架学习(一)入门

    spring 入门--IOC  1.导入jar包 4 + 1  : 4个核心(beans.core.context.expression) + 1个依赖(commons-loggins...jar) ...

  5. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  6. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  7. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  8. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  9. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  10. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

随机推荐

  1. AC日记——NOI2016区间 bzoj 4653

    4653 思路: 线段树,指针滑动: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 #def ...

  2. AC日记——可怜的狗狗 洛谷 P1533

    可怜的狗狗 思路: 主席树第k大: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300001 #defin ...

  3. vmware + ubuntu 64 安装 node.js v8.9.3

    第一次使用虚拟机,第一次使用linux系统,第一次安装使用node.js 虚拟机安装不用多说,安装好之后下载ubuntu 64位版本文件 在vm中点击“创建新的虚拟机”,选择下载的ubuntu iso ...

  4. CF1027C Minimum Value Rectangle【贪心/公式化简】

    https://www.luogu.org/problemnew/show/CF1027C #include<cstdio> #include<string> #include ...

  5. HDU 5552 Bus Routes(2015合肥现场赛A,计数,分治NTT)

    题意  给定n个点,任意两点之间可以不连边也可以连边.如果连边的话可以染上m种颜色. 求最后形成的图,是一个带环连通图的方案数. 首先答案是n个点的图减去n个点能形成的树. n个点能形成的树的方案数比 ...

  6. Eclipse - Tasks介绍

    完整的过程 1.1.新定义标签 位置:Window —— Preferences —— Java —— Compiler —— Task Tags —— New 说明: 默认的任务标签有三个FIXME ...

  7. Java Eclipse插件

    EasyExplore 快速打开文件所在目录1 http://sourceforge.net/projects/easystruts/ OpenExplorer 快速打开文件所在目录2 https:/ ...

  8. poj 2287(贪心)

    Tian Ji -- The Horse Racing Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12490   Acc ...

  9. [BZOJ3622]已经没有什么好害怕的了(容斥DP)

    给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...

  10. 【ZJOI2017】线段树

    题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的 功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜又开始研究起线段树来了,有所不同的是,她把目光放 ...