SpringMVC入门

1 SpringMVC入门

2.1 操作步骤

①导入SpringMVC相关坐标

② 创建Controller和业务方法(等同于Servlet)

③ 创建spring-mvc.xml

④ 在web.xml中配置SpringMVC核心控制器

⑤ 设定具体Controller的访问路径

⑥ 设置返回页面

2.2 详细流程

—案例工作流程分析
在这里插入图片描述

①在导入SpringMVC相关坐标

   <dependencies>
        <!-- servlet3.1规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--jsp坐标-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <!--spring web的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
    </dependencies>
    
    <--这里因为需要用到tomcat服务所以要导入相关jar包-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>80</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

② 创建Controller和业务方法(等同于Servlet)

public class UserController {
    public void show1(String name,int age){
        System.out.println("name="+name+"   age="+age);
    }
}

③ 创建spring-mvc.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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--扫描加载所有的控制类-->
    <context:component-scan base-package="com.itheima.controller" />
</beans>

④ 在web.xml中配置SpringMVC核心控制器
标签设置“*.do” 用于条件访问路径问题,比如在目标方法上写@RequestMapping("/UserController")则访问路径应为//http://localhost/UserController.do 但是实际访问路径会由SpringMVC自动解析为//http://localhost/UserController

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
     <!--<url-pattern>/</url-pattern>-->
        <url-pattern>*.do</url-pattern>
</servlet-mapping>

⑤ 设定具体Controller的访问路径
@RequestMappin 这个注解可以在类名+方法名上声明(其实就是为了以后建的包多了方便区分),也可以直接写在目标方法名上,

//写在类名+方法名上
//访问路径为:http://localhost/User/UserController.do
@Controller
@RequestMapping("/User")
public class UserController {
	//设定当前方法的访问映射地址
    @RequestMapping("/UserController")
    //设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
    public String show1(String name,int age){
        System.out.println("name="+name+"   age="+age);
		 //设置具体跳转页面,这里的return相当于servlet中的“request.getRequestDispatcher("success.jsp")”
        return "success.jsp";
    }
}

//写在方法名上
//访问路径为:http://localhost/UserController.do
@Controller
public class UserController {
    @RequestMapping("/UserController")
    public String show1(String name,int age){
        System.out.println("name="+name+"   age="+age);
        return "success.jsp";
    }
}

2 常规配置

2.1 Controller扫描

SpringMVC的处理器对应的bean必须按照规范格式开发,未避免加入无效的bean可通过bean加载过滤器进
行包含设定或排除设定,表现层bean标注通常设定为@Controller

xml方式


  <!--扫描加载所有的controller类-->
  <!--方式一-->
    <context:component-scan base-package="com.itheima.controller" />

<!--方式二-->
注意如果使用此方式一定要写上 use-default-filters="false" 不然“<context:include-filter/>”不会生效
        <context:component-scan base-package="com.itheima.controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>

2.2 静态资源加载


<!--方式一:放行指定类型静态资源配置方式-->
<mvc:resources mapping="/img/**" location="/img/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>

<!--方式二:SpringMVC提供的通用资源放行方式(使用最多,也更方便)-->
<mvc:default-servlet-handler/>

2.3 中文乱码处理

SpringMVC提供专用的中文字符过滤器,用于处理乱码问题
配置在 web.xml 里面

<!--乱码处理过滤器,与Servlet中使用的完全相同,差异之处在于处理器的类由Spring提供(用到时候直接CV大发就好 不要修改任何东西)-->
<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>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3 类型转换器

3.1 日期类型格式转换-全局配置

SpringMVC会对接收的数据自动进行类型转换,该工作通过Converter接口实现

SpringMVC默认支持大部分的数据类型转换, 包含String->Date的转换

但需要注意的是, SpringMVC默认支持的时间格式是"yyyy/MM/dd"

SpringMVC支持"自定义的转换格式并覆盖系统转换格式"

语法

<!--1.设定格式类型Converter,注册为Bean,受SpringMVC管理-->
<bean id="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <!--2.自定义Converter格式类型设定,该设定使用的是同类型覆盖的思想-->
    <property name="formatters">
        <!--3.使用set保障相同类型的转换器仅保留一个,避免冲突-->
        <set>
            <!--4.设置具体的格式类型-->
            <bean class="org.springframework.format.datetime.DateFormatter">
                <!--5.类型规则-->
                <property name="pattern" value="yyyy-MM-dd"/>
            </bean>
        </set>
    </property>
</bean>

<!--6.启用自定义Converter-->
<mvc:annotation-driven conversion-service="conversionService"/>

3.2 日期类型格式转换-简化版

语法:

​ @DateTimeFormat(pattern = “yyyy-MM-dd”)

位置:

​ "方法形参"或者"成员变量"上

实例:

public String show(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){
    System.out.println("date="+date);
    return "success.jsp";
}
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;

注意:

<!--该操作, 依赖注解驱动支持,在spring-mvc.xml中写上-->
<mvc:annotation-driven />  

3.3 自定义类型转换器(一般用不上)

除上述操作外, SpringMVC还允许用户自定义类型转换器

① 自定义类型转换器

//自定义类型转换器,实现Converter接口
//Converter<String, Date>:表示当String转换为Date时
public class MyDateConverter implements Converter<String, Date> {
    //重写接口的抽象方法,参数由泛型决定
    public Date convert(String source) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        //类型转换器无法预计使用过程中出现的异常,因此必须在类型转换器内部捕获,不允许抛出,框架无法预计此类异常如何处理
        try {
            date = df.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

② 配置自定义转换器

<!--1.设定自定义Converter服务bean-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!--2.注入所有的自定义Converter,该设定使用的是同类型覆盖的思想-->
    <property name="converters">
        <!--3.set保障同类型转换器仅保留一个,去重规则以Converter<S,T>的泛型为准-->
        <set>
            <!--4.具体的类型转换器-->
            <bean class="com.itheima.converter.DateConverter"></bean>
        </set>
    </property>
</bean>

③ 开启注解驱动

<!--开启注解驱动,加载自定义格式化转换器对应的类型转换服务-->
<mvc:annotation-driven conversion-service="conversionService"/>

4 请求Request

4.1 获取请求参数

@Controller
public class RequestController {
    //http://localhost/show1.do?name=zhangsan&age=23
    @RequestMapping("/show1")
    public String show1(String name,int age){
        System.out.println(name+"  "+age);
        return "success.jsp";
    }

    //http://localhost/show2.do?name=zhangsan&age=23
    @RequestMapping("/show2")
    public String show2(User user){
        System.out.println(user);
        return "success.jsp";
    }


    //http://localhost/show3.do?strs=aaa&strs=bbb&strs=ccc
    @RequestMapping("/show3")
    public String show3(String[] strs){
        System.out.println(Arrays.toString(strs));
        return "success.jsp";
    }

    //http://localhost/show4.do?strs=aaa&strs=bbb&strs=ccc
    @RequestMapping("/show4")
    public String show4(@RequestParam("strs") List<String> strs){
        System.out.println(strs);
        return "success.jsp";
    }
}

4.2 其他请求数据(注意路径设置,非必须这样设置只是为了迎合上面所说的路径设置方式)

@Controller
@RequestMapping("/other")
public class OtherController {

	//http://localhost/other/show1.do
    @RequestMapping("/show1")
    @ResponseBody
    public String show1(@RequestHeader("User-Agent") String UserAgent){
        System.out.println(UserAgent);
        return "success.jsp";
    }
	
	//http://localhost/other/show2.do
    @RequestMapping("show2")
    @ResponseBody
    public String show2(@CookieValue("JSESSIONID") String sid){ //获取键的名字为"JSESSIONID"的Cookie的值
        System.out.println(sid);
        return "success.jsp";
    }

//如果,前台发送过来的参数是"json字符串",则需要在后台加上@RequestBody接收参数
    //在服务器集群情况下,服务器之间只能收发字符串数据,所以在那种情况下,使用比较多
    @RequestMapping("/show3")
    @ResponseBody
    public void show3(@RequestBody User user){ //获取User-Agent请求头
        System.out.println(user);
    }

    @RequestMapping("/show4")
    @ResponseBody
    public void show4(@RequestParam String name){   //要求请求show2时,必须携带name参数吗,否则报错
        System.out.println(name);
    }

    //http://localhost/show5?id=5   //原来带参数的写法
    //http://localhost/show5/5      //Restful带参数的写法
    @RequestMapping("/show5/{aaa}")
    @ResponseBody
    public String show5(@PathVariable("aaa") String id) {  //用于:截取请求路径中的一部分
        System.out.println(id);
        return "success";
    }
}

SpringMVC三层架构

  • 表现层:负责数据展示

  • 业务层:负责业务处理

  • 数据层:负责数据操作
    在这里插入图片描述MVC(Model View Controller),一种用于设计创建Web应用程序表现层的模式

  • Model(模型):数据模型,用于封装数据

  • View(视图):页面视图,用于展示数据

  • jsp

  • html

Controller(控制器):处理用户交互的调度器,用于根据用户需求处理程序逻辑

  • Servlet

  • SpringMVC
    在这里插入图片描述

  • 阐述SpringMVC框架和Struts2框架的区别

    SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
    下面这个连接说的还是挺详细的
    SpringMVC框架和Struts2框架的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值