spring学习篇之springMVC(2)

1.spring提供获取应用上下文的工具

应用上下文的工具

2.springMVC

2.1 简介

springMVC是一种基于java实现的MVC设计模型的请求驱动类型的轻量级Web框架,属于springFrameWork的后续产品,已经融合在spring web flow中。
springMVC目前是最为主流的MVC框架之一。它通过注解,让一个简单的java类称为处理请求的控制器,而无需任何接口,它还支持Restful的编程风格请求。

2.2 springMVC开发的基本流程

1.导入SpringMVC的依赖坐标
2.配置springMVC的核心控制器DispathcherServlet

在web.xml里配置springMVC的前端控制器

<servlet>
	<servlet-name>DispathcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispathcherServlet</servlet-class>
	//加载springMVC-xml
	<init-param>contextConfiguration<param>
	<param-name>classpath:spring-mvc.xml</param-name>
	//load-on-startup配置为web启动便创建Servlet对象
	<load-on-startup[>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>DispathcherServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

3.创建Controller类和视图页面

public class UserController{
	public String test(){
		System.out.println("SpringMVC test....");
		//return 需要跳转的视图
		return "success.jsp"
	}
}

4.使用注解配置Controller类中业务方法的映射地址
在上诉代码的基础上修改

@Controller
public class UserController{
	@RequestMapping("/quick")
	public String test(){
		System.out.println("SpringMVC test....");
		//return 需要跳转的视图
		return "success.jsp"
	}
}

5.配置SpringMVC的核心文件spring-mvc.xml
resources目录下新建一个文件spring-mvc.xml

<!--Controller的组件扫描-->
<context:component-scan base-package="com.test.controller"/>

6.客户端发起请求测试

2.3 springMVC的组件解析

springMVC的组件
执行流程如下所示:
执行流程

2.4 springMVC的注解

@RequestMapping
//作用:用于建立URL请求和处理方法之间的映射关系
//位置:
//1.类上:请求URL的第一级访问目录,如果此处不写的话,默认应用的根目录
//2.方法上:请求URL的第二级访问目录,与类上使用的RequestMapping标注的一级目录一起构成访问的虚拟路径
//参数:1.value:用于指定的URL  eg:@RequestMapping(value="/quick")  只有一个参数时,value可省略
//2.method:指定http请求方式  eg:@RequestMapping(value="/quick",method="post")
//params:用于指定限制请求参数的条件,它支持简单的表达式,要求请求参数的key和value必须和配置的一模一样。  eg:params="username" 请求资源需要携带username参数  params="age!=18" 请求参数的age不能等于18

2.5 SpringMVC的注解解析

1.mvc命名空间的引入
mvc命名空间的引入
2.组件扫描
SpringMVC是基于Spring容器的,所以在进行Spring操作时,需要将controller存储到spring容器中,如果需要使用@controller注解进行标注的话,需要使用:

<context:compponent-scan base-package="com.test.controller"/>进行组件扫描

2.6 SpringMVC的xml配置解析

//spring-mvc.xml
1.配置controller组件的扫描
2.配置组件  视图解析器,处理适配器等等 eg:可以通过配置视图解析器的前缀和后缀来简化开发。前缀:profix 后缀:suffix

2.7 知识点总结

总结

3.SpringMVC的数据响应

3.1 数据响应的方式

1.页面跳转
直接返回字符串
通过ModelAndView对象返回

//ModelAndView
//model:模型,作用:封装数据 
//view:视图 作用:展示数据
ModelAndView modelandview = new ModelAndView();
//设置视图名称
modelandview.setViewName("success");
//设置model数据
modelandview.addObject("username","test");
return modelandview;

设置完model的数据后,success该视图可以直接取到设置的数据。

//可以使用下列方法取得数据
${username}

2.回写数据
直接返回字符串:
Web基础阶段,客户端访问服务器端,如果想要直接返回字符串当做响应体返回的话,可以使用response.getWriter.print(“test”) 即可,那么controller中需要返回字符串应该怎么办呢?
(1)通过SpringMVC框架注入response对象,使用response.getWriter.print(“test”) ,此时不需要视图的跳转,方法的返回值为void。(在当前页面返回数据,不要页面的跳转)
(2) 在方法上添加注解@ResponseBody 作用:不要进行页面跳转,直接返回字符串。

返回对象或者集合
可以使用SpringMVC自动帮你转换,需要配置处理映射器

return user;
//配置处理映射器
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="messageConverters">
			<list>
				<bean
					class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
			</list>
		</property>
	</bean>
// 需要添加的依赖
jackson-annotations-2.0.2.jar
jackson-databind-2.0.2.jar
jackson-core-2.0.2.jar

上述方法可以使用更加简便的方式配置,可以使用SpringMVC的注解代替上述繁琐的配置:

</mvc:annotation-driven/>
//mvc的注解驱动
//在SpringMVC的各个组件中,处理映射器、处理适配器、视图解析器三大组件,使用</mvc:annotation-driven/>自动加载
//RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在Spring-mvc.xml
//配置文件中使用</mvc:annotation-driven/>替代注解处理器和适配器的配置,同时使用</mvc:annotation-driven/>会默认
//配置对象或者集合的josn字符串转换。

3.2 知识点总结

知识点总结

4. SpringMVC的请求

4.1 请求参数的格式

//请求的格式
name=value&name=value
//服务器要想获得请求的参数,有时还要进行数据的封装,Spring可以接受如下类型的参数
1.基本类型参数
2.pojo类型参数
3.数组类型参数
4.集合类型参数

4.2 基本类型参数

//http请求
http://localhost:8088/quick?username="zhangsan"&age=18
@RequestMapping("/quick")
//@ResponseBody该注解可以不进行页面跳转
@ResponseBody
public void save(String username,int age){
	//可以直接获得http请求中携带的普通类型参数
	//此处的username="zhangsan" age=18
	System.out.println(username);
	System.out.println(age);
}

4.3 POJO类型数据

controller中的业务方法中的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
eg:

//http请求如下所示
http://localhost:8088/quick?username="zhangsan"&age=18

//代码如下
//定义一个User类
public class User{
	private String username;
	private int age;
	getset 方法
}

//底层根据反射调用get和set方法直接自动将数据封装到User对象中
@RequestMapping("/quick")
//@ResponseBody该注解可以不进行页面跳转
@ResponseBody
public void save(User user){
	//可以直接获得http请求中携带的普通类型参数
	//此处的username="zhangsan" age=18
	System.out.println(user);
}
//上述对应的输出为 User{username='zhangsan',age=18}

4.4 数组类型对象

controller中的业务方法数组名称与请求参数的name一致,参数会自动映射。
eg:

http://localhost:8088/quick?str1=111&str1=222
//代码如下:
@RequestMapping("/quick")
//@ResponseBody该注解可以不进行页面跳转
@ResponseBody
public void save(String[] str1,String[] str2){
	//字符数组打印的是地址
	System.out.println(str1);
	System.out.println(str2);
}
//str1数组应为str1['111','222']

4.5 集合类型的参数

(1)获得集合参数时,需要将集合封装到一个一个POJO中才可以,可以取名为VO对象。
在jsp文件中定义,从表单上获取:
jsp文件中定义
访问页面:http://localhost:8088/from.jsp
访问页面

//定义VO对象
public class VO1{
	private List<User user> userlist;
	getset方法
	。。。
	tostring 方法//可自行选择,方便打印
}

//获取VO对象
public void save(VO1 vo1){
	System.out.println(vo1);
}
//打印结果如下:
VO1{userlist=[User{username='zhangsan',age=18},User{username='lisi',age=20}]}

(2)当使用ajax提交时,可以指定contentType为json格式,那么在方法参数位置使用@RequestBody可以直接收集集合数据,而无需用VO类型封装
ajax提交时

public void save(@RequestBody List<User> userlist){
	System.out.println(userlist);
}
//可以实现和上述一样的效果

//spring-mvc.xml需要添加下列配置
//作用:开放资源的访问
<mvc:resources mapping="/js/**" location="/js/"/>
//开放img目录下所有图片的访问资格
<mvc:resources mapping="/img/**" location="/img/"/>

//或者将静态资源的寻找交给原始的web服务器,tomcat
<mvc:default-servlet-handler>

4.6 请求数据乱码问题

当post请求数据时,数据会出现乱码问题,我们可以设置一个过滤器来进行编码的过滤

<!-- 配置编码过滤器 characterEncodingFilter 解决中文Post乱码问题  -->
<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>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

//配置哪些请求
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <servlet-name>springmvc</servlet-name>
</filter-mapping>
//filter-name:过滤器的名称与过滤器中的filter-name匹配
//servlet-name:与servlet中的servlet-name匹配

4.7 参数绑定的注解@RequestParam

当请求的参数名称与controller的业务方法参数的名称不一致时,就需要注解@RequestParam注解显示的绑定

//http请求为:
http://localhost:8088/quick?name=zhangsan
//代码如下
@RequestMapping("/quick")
//@ResponseBody该注解可以不进行页面跳转
@ResponseBody
//注意name和username匹配不上
public void save(@RequestParam(value="name") String username){
	System.out.println(username);
}
//上述打印结果为:zhangsan
//可以在RequestParam中增加参数request=false,则请求时,带不带参数皆可
//defaultValue:当没有指定请求参数时,赋值一个默认值

4.8 获取Restful风格的参数

Restful风格的请求是使用url+请求方式表示一次请求目的,HTTP协议里面四个表示操作方式的动词如下:
GET:用于获取资源,
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源
eg:
get /user/1 得到id=1的user
post /user 新增user
put /user/1 更新id=1的user
delete /user/1 删除id=1的user

上述url地址的/user/1中的1就是要获得的请求参数,在springMVC中可以使用占位符进行参数绑定,地址/user/1可以写成/user/{id},占位符{id}就是对应1的值,在业务方法中,我们可以使用@PathVariable注解进行占位符的匹配获取工作。

//http
http://localhost:8088/test/quick/zhangsan
//代码
@RequestMapping("/user/quick/{name}")
@ResponseBody
public void save(@PathVariable(value="name" required=true) String name){
	System.out.println(name)
}
//打印结果  zhangsan

4.9 自定义类型转换器

SpringMVC默认提供了一些自动类型转换器,例如客户端提供的字符串类型可以转换成int类型。但是默认提供的类型转换器并不能满足所有的需求,例如日期类型转换器需要自己来实现。
自定义转换器的步骤:
1.定义转换器实现converter接口
2.在配置文件中声明转换器
3.在annotation:driven中引用转换器

//代码
public void DateConverter implement Converter<String,Date>{
	public Date converter(String datestr){
		//日期字符串转换成Date类型,进行返回
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = format.parse(datestr);
		return date;
	}
}
// 声明
<bean id="ConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
	<property>
		<list>
			<bean class="com.test.Converter.DateConverter"></bean>
		</list>
	</property>
</bean>

//<annotation:driven>中引用转换器
<--mvc注解驱动>
<mvc:annotation-driven conversion-service="ConversionService"/>

4.10 获得Servlet相关API

SpringMVC支持原始的ServletAPI对象作为控制器方法的参数注入,常用的对象如下:
HTTPServletRequest
HTTPServletResponse
HTTPSession
获得Servlet相关API

4.11 获得请求头

1.@RequestHeader
使用@RequestHeader可以获得请求头的信息,相当于web阶段学习的request.getHeader(name)

//属性如下:
value:请求头的名称
required:是否必须携带此请求头
//代码
public void save(@RequestHeader(value="User_Agent") String user_agent){
	System.out.println("user_agent");
}
//打印的是请求头中user_agent的相关信息

2.@CookieValue
使用@CookieValue获取指定的Cookie值
@CookieValue注解的属性如下所示:

//属性
value:指定cookie的名称
required:请求时是否必须携带此cookie
//代码
public void save(@CookieValue(value="JSESSIONID") String jsessionid){
	System.out.println("jsessionid");
}
//打印的结果是JSESSIONID的值

4.12 文件上传

1.文件上传客户端是三要素
表单项 type=“file”
表单的提交方式:post
表单的enctype属性是多部分表单形式,及enctype=“multipart/from-data”

//jsp文件
<from action="${pageContext.request.contextPath}/quick" method="post" enctype="multipart/from-data">
名称: <input type="text" name="name"><br/>
文件: <input type="file" name="upload"><br/>
<input type="submit" value="提交"><br/>
</from>

2.文件上传原理
文件上传原理
3.单文件上传步骤
导入fileupload和io坐标

//maven依赖
<dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
</dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
</dependency>
//commons-lang-2.6.jar // 获得随机数,用于给文件取名,可选择使用
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.6</version>
</dependency>

配置文件上传解析器

//spring-mvc.xml
<!--配置MultipartResolver(文件上传解析器),用于文件上传-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件大小上限-->
        <property name="maxInMemorySize" value="5000000"/>
        <!--请求编码格式-->
        <property name="defaultEncoding" value="UTF-8"/>    
    </bean>

编写文件上传代码

//java代码
@RequestMapping("/quick")
@ResponseBody
public void upload(String name,MultipartFile uplaodfile){
	//获得文件的名称
	String originalFilename = uplaodfile.getOriginalFilename();
	//保存文件,这里测试是保存到本地磁盘,可根据自己的需求修改
	uplaodfile.transferTo(new File("C:\\upload"+originalFilename ));
}
//html代码
<from action="${pageContext.request.contextPath}/quick" method="post" enctype="multipart/from-data">
名称: <input type="text" name="name"><br/>
文件: <input type="file" name="uploadfile"><br/>
<input type="submit" value="提交"><br/>
</from>

4.多文件上传

//html代码
<from action="${pageContext.request.contextPath}/quick" method="post" enctype="multipart/from-data">
名称: <input type="text" name="name"><br/>
文件: <input type="file" name="uploadfile"><br/>
文件: <input type="file" name="uploadfile2"><br/>
<input type="submit" value="提交"><br/>
</from>
//java代码
@RequestMapping("/quick")
@ResponseBody
public void upload(String name,MultipartFile uplaodfile,MultipartFile uplaodfile2){
	//获得文件的名称
	String originalFilename1 = uplaodfile.getOriginalFilename();
	String originalFilename2 = uplaodfile.getOriginalFilename();
	//保存文件,这里测试是保存到本地磁盘,可根据自己的需求修改
	uplaodfile.transferTo(new File("C:\\upload"+originalFilename1));
	uplaodfile.transferTo(new File("C:\\upload"+originalFilename2));
}

或者

//html代码
<from action="${pageContext.request.contextPath}/quick" method="post" enctype="multipart/from-data">
名称: <input type="text" name="name"><br/>
文件: <input type="file" name="uploadfile"><br/>
文件: <input type="file" name="uploadfile"><br/>
<input type="submit" value="提交"><br/>
</from>
//java代码
@RequestMapping("/quick")
@ResponseBody
public void upload(String name,MultipartFile[] uplaodfile){
	int i = 1
	//获得文件的名称
	for(MultipartFile multipartFile:uplaodfile){
		String filename = multipartFile.getOriginalFilename();
		//保存文件,这里测试是保存到本地磁盘,可根据自己的需求修改
		uplaodfile.transferTo(new File("C:\\upload"+filename));
	}
}

4.13 知识点总结

数据请求方式
获取数据细节

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值