SpringMVC

Springmvc优势:

1. 组件型框架,所有的组件基于角色划分,非常清晰 分工明确
	1. 前段控制器(DispatherServlet)
	2. 请求处理器(HadlerMapping)
	3. 处理器适配器(HadlerAdapter)
	4. 视图解析器(ViewResolver)
	5. 页面控制器(Controller)
	6. 验证器(Vaildator)
2. 可以和spring无缝集成
3. 功能强大 数据验证 格式化 参数绑定
4. 强大的JSP标签库...

SpringMVC和Struts2框架的对比

* 共同点:
	1. 都是基于MVC模型编写的表现层框架
	2. 底层都是原始的ServletAPI
	3. 处理请求的机制都是一个核心的控制器
* 区别:
	1. Spring mvc 核心本质是一个Servlet  Struts2核心是Filter
	2. Spring mvc 基于方法的,struts2是基于类的  --> Spring mvc执行效率比struts高
	3. struts2的OGNL表达式页面开发效率比spring mvc高, 但执行效率没哟JSTL表达式执行效率高

spring mvc 入门案例

  • 步骤
    1. 创建一个maven项目,将其部署到本地tomcat服务器中,添加相关坐标依赖
		<spring.version>5.0.2.RELEASE</spring.version>
     
     <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
	          <scope>provided</scope>
	      </dependency>
	   ```
	   
	   
	   
	2. 在web.xml中配置核心的控制器 DispatcherServlet
		
		```xml
		<servlet>
		    <servlet-name>dispatcherServlet</servlet-name>
		    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		    <!--在服务器启动时,加载springmvc.xml文件-->
		    <init-param>
		      <param-name>contextConfigLocation</param-name>
		      <param-value>classpath:springmvc.xml</param-value>
	       </init-param>
	       <load-on-startup>1</load-on-startup>  <!--当服务器启动时加载控制器-->
	   </servlet>
	   ```
	   
	   
	   
	3. 在resources目录创建一个springmvc.xml文件,定义以下信息:
		
		```xml
		<?xml version="1.0" encoding="UTF-8"?>
		<beans xmlns="http://www.springframework.org/schema/beans"
		       xmlns:mvc="http://www.springframework.org/schema/mvc"
		       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.xsd
		                            http://www.springframework.org/schema/mvc
		                            http://www.springframework.org/schema/mvc/spring-mvc.xsd
		                            http://www.springframework.org/schema/context
		                            http://www.springframework.org/schema/context/spring-context.xsd">
		
		    <!--开启注解扫描-->
		    <context:component-scan base-package="com.huike"/>
		
		    <!--视图解析器对象 用于寻找返回页面-->
		    <bean id="internalResourceViewResolver"
		          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		        <property name="prefix" value="/WEB-INF/pages/"/>
		        <property name="suffix" value=".jsp"/>
		
		    </bean>
		
		    <!--手动开启spring mvc 框架注解的支持-->
		    <mvc:annotation-driven/>
		</beans>
		```
		
		
		
	4. 新建一个index.jsp页面和success.jsp页面以及HelloController,编写以下代码:
		1. index.jsp
			
			```html
			<a href="hello">入门程序,点我试试...</a>
			```
			
			
			
		2. success.jsp   在WEB-INF/pages/目录下
			
			```html
			<h3>入门案例运行成功了...</h3>
			```
			
		
			
		3. HelloController
			
			```java
			@Controller
			public class HelloController {
			    @RequestMapping("/hello")
			    public String sayHello(){
			        System.out.println("执行了hello方法...");
			        return  "success";
			    }
		
			}
			```
			
			5.运行服务器即可.
			
			5.运行服务器即可.

## RequestMapping详解:  
1. 作用:用于建立请求URL和处理请求方法之间的对应关系
2. 源码
	*  @Target({ElementType.METHOD, ElementType.TYPE}):代表该注解既可以定义在方法上,也可以定义在类|接口上
		*  定义在类上:代表一级目录
		*  定义在方法上:代表二级目录
			*  例如 请求路径 为 /account/add   此时 account 代表一级目录 add代表二级目录
		*  作用:使项目模块化,可以方便的进行模块化管理
		
	*  path 指定请求路径的url  value value属性和path属性是一样的
	*  method():用于指定请求的方式
	*  params:用于指定限制请求参数的条件.它支持一个简单的表达式.要求请求参数的key和value必须和配置的一模一样
		* params = "username"  代表我的请求参数中必须有一个叫username的参数
		* params = "username=123"  代表我的请求参数中必须有一个叫username的参数 并且值必须为123
		* params = {"username=123","pwd=123456"} 代表我的请求参数中必须有一个叫username的参数 并且值必须为123 还必须有一个叫pwd的参	                                         数值必须为123456
	* headers:用于指定限制请求消息头的条件

## 请求参数绑定:

1. 支持的数据类型:
	1. 基本类型(基本数据类型和String)  
		* 保证传递参数的key值和方法中的形参的名字保持一致即可
	2. POJO(实体类对象 JavaBean)
		1. 定义一个表单 如何将表单中的数据封装成一个对象的属性并且传递给Controller   
			* Account username password money
			* 保证表单中每一个input输入框中的name值必须和方法参数对象中的属性值一致即可
		2. 对象中含有另一个对象的引用 怎么处理  Account对象中有一个User属性 User对象
			* 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
	3. 数组和集合类型(Array List Map)
		* List和Map作为对象的属性存在,在表单请求参数的名称必须和JavaBean中的属性名称相同 
		* 给List集合中的元素赋值 需要使用下标  eg: list[0].uname;
		* 给Map集合中的元素赋值  需要使用键值对 eg: map['one'].uname;
* 存在的问题: 
	1. 类型转换问题
		* 我们前段页面jsp 传递的参数 都是字符串类型 但是后台javaBean的某些属性却是其它数据类型的  比如 double money  int age
			* 我们的springmvc可以实现一些数据类型的自动转换 有内置的转换器

			* 内置转换器有以下几种
				* Boolean--->String objectToStringConverter
				* Character-->Number
				* Character-->String
				* Enum-->String
				* String-->Enum 等等

		* 如何自定义类型转换器
			* 自定义字符串转日期  类型转换器
				* 步骤:
					1. 定义一个类 实现Converter接口   public interface Converter<S, T>
						         S:表示接收的参数类型   T:表示要转换的目标类型
				    2. 在重写的convert方法中写业务逻辑代码
				    3. 需要配置该类为类型转换器  需要在springmvc.xml中加入以下代码:

```xml
<!--配置自定义类型转换器-->
<bean id="conversionService"
    class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.huike.utils.StringToDateConverter"></bean>
        </set>
    </property>
</bean>

<!--手动开启spring mvc 框架注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
  1. 中文乱码问题:
    • 可以通过在web.xml中配置过滤器解决 CharacterEncodingFilter
<!--配置  解决中文乱码的过滤器   注意标签顺序问题-->
<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>
  1. 绑定机制
    1. 表单提交的数据都是k=v格式的 username=haha&password=123
    2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
    3. 要求:提交表单的name和参数的名称是相同的

常用注解:

  1. RequetParam:把请求中指定名称的参数给控制器中的形参赋值

    • @Target({ElementType.PARAMETER}) 只能作用于参数
    • 属性值:
      • name(value):如果只有该属性 名字可以省略 请求参数中的名称
      • required:请求参数中是否必须提供此参数. 默认值:true 表示必须提供,如果不提供则报错
  2. RequestBody注解

    1. 作用:用于获取请求体的内容(注意:get方法不可以)
    2. 属性:required:是否必须有请求体,默认值是true
    3. 注意:required的取值默认为true 当为true时,get请求会直接报错;如果取值为false,get请求不会报错但参数为null;
  3. PathVariable注解

    • 用于绑定url中的占位符 例如: /delete/{id} 这个{id}为占位符
    • 属性:
      1. value:用于指定url占位符的名称
      2. required:是否必须提供占位符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值