SpringMVC详细学习笔记
Spring MVC
1 spring MVC简介:
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
2 SpringMVC与struts2的区别
1、springmvc基于方法开发的,struts2基于类开发的。springmvc将url和controller里的方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。方法执行结束,形参数据销毁。springmvc的controller开发类似web service开发。
2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。
3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。
3 使用 spring MVC
1 导入jar包
2 在web.xml中配置核心控制器(前端控制器) DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
执行springmvc 的前端控制器,并加载springmvc 的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3 配置spring
MVC的配置文件
文件名任意,通常情况下,文件名为 核心控制器配置时
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
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
http://www.springframework.org/schema/context/spring-context.xsd">
启动spring的注解
<context:annotation-config/>
启动bean扫描
<context:component-scan
base-package="com.hxzy.controller"/>
<!-- 使用spring 的视图解析器 跳转页面使用 -->
<bean
id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property
name="prefix" value="/"></property><!-- 跳转路径的前缀 -->
<property
name="suffix" value=".jsp"></property><!-- 能运行的页面的后缀是能是jsp的 -->
</bean>
</beans>
3 Controller(控制器)
import
org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import
org.springframework.web.bind.annotation.RequestMapping;
@Controller //表示当前的类,是控制层的内容
@RequestMapping("helloContr") //需要执行的模块的名称,类名称,千万别重复
public class HelloController {
@RequestMapping("/hello")
public
String helloDingDing(Model model){
/**
* Model model 模型类,可以使用这个类,添加属性,
* 用于传递到页面上的数据
*/
model.addAttribute("message",
"您好,今天凉快");
return
"/helloWord";//跳转后,需要执行的jsp页面的名字
}
}
1 @Controller 表示这个类是控制层
2 @RequestMapping配置Controller的访问路径
加在类上,也要加在方法上
例如:
@RequestMapping(value="RegisterController.do")
public class RegisterController{
这个controller的访问路径为
RegisterController.do
3 controller中的方法:
返回值类型 任意
方法名 任意
参数列表 任意
建议: 返回String类型---- 用来做跳转路径
方法要想被访问,必须在方法也添加@RequestMapping
@RequestMapping
public String register(){
return "index.jsp";
}
4 关于@RequestMapping
1 加在类上 @RequestMapping(value="RegisterController.do")
配置controller的访问路径
2 加在方法上 @RequestMapping
使得方法可以被访问
3 加在方法上 @RequestMapping 一些其他属性的配置
@RequestMapping(method=RequestMethod.GET)
表示这个方法只有 是GET请求时才能访问
4 一个controller中有多个方法时,如何区分访问
@RequestMapping(method=RequestMethod.GET,params="method=aaa")
这个方法的访问路径为:
HelloWorldController.do?method=aaa
5 不在class上配置@RequestMapping,只在 方法上配置 @RequestMapping
访问路径就是 项目名/helloworld/test.do
@RequestMapping(value="/helloworld/test")
5 controller中 获取客户端提交的数据的方式:
1 方法中定义 HttpServletRequest类型的参数
public String register(HttpServletRequest request){
String name =
request.getParameter(“name”);
return "index.jsp";
}
@RequestParam("name")
2 在方法参数中使用 @RequestParam 注解
public String
register(@RequestParam("name") String name,@RequestParam("age") int age){
System.out.println(name);
System.out.println(age);
@RequestParam("name")
中的 "name" 要和请求参数的key值相同
return "index.jsp";
}
注意:当请求参数和 方法参数同名时,@RequestParam注解可以省略
3 使用 @PathVariable 注解 --这种用法比较特殊,少用
@RequestMapping(value="/hello/{name}/{age}")
public
String hello(@PathVariable("name") String
name,@PathVariable("age") int age){
//省略了 class 上的@RequestMapping
//
访问这个方法???
hello/zhangsan/100.do
System.out.println(name+"\t"+age);
return
"/helloworld.jsp";
}
6 controller 方法中 在作用域中设置值带回给客户端
1 通过 request.setAttribute();
2 通过方法的参数 ModelMap model
public String
register(ModelMap modelMap){
modelMap.put(“key”,Object); --放在request作用域
}
7 controller中使用Session
1 通过request 获取session request.getSession()
2 使用 @SessionAttributes
@SessionAttributes 的使用方式:
必须加在class上
@SessionAttributes({"user","name",.....}) @RequestMapping(value="RegisterController.do")
public class RegisterController{
public String register(ModelMap modelMap){
modelMap.put("user",user); --放在request作用域
modelMap.put("name","王帅");
}
}
modelMap中存的值 将会在session中也保存一份
8 关于跳转
1 返回字符串 默认是转发方式
2 重定向
return “redirect:index.jsp”
3 跳转路径 前缀后缀的设置
<!-- 配置视图
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/view/"
p:suffix=".jsp">
<property
name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
-->
return “index” 将会跳转到
/WEB-INF/view/index.jsp
9 关于使用ModelAndView
通常用于方法的返回值
public ModelAndView test2(){
String
name = “王帅”;
return new
ModelAndView(new Redirect(“index.jsp”));
return
new ModelAndView(new Redirect(“index.jsp”),”name”,name); -- 另一种带值得方式
return new
ModelAndView(new RedirectViews(“index.jsp”),map); --map 为Map 也是用来带值
}
或
public ModelAndView test2(){
ModelAndView mav = new ModelAndView();
mav.setViewName(viewName); //设置跳转路径
mav.addObject(obj) // 这种设置方式,带的值 key为这个对象所属类的 类名首字母小写
mav.addObject(“key”,obj)
return
mav;
}
10
@ModelAttribute注解
作用一:获取请求参数:
public String
register(@ModelAttribute User user,@RequestParam("birthday111")
String birthday)
客户端提交的数据会直接封装 user中,要保证请求参数的key和user的属性相同
还会将user存入request作用域
对于Date的birthday无法完成直接的赋值,因此单独进行配置
另一个作用:加在方法上,方法将会在controller中要调用的方法之前执行
@ModelAttribute("myList")
public
List<User> getList(){ //这个方法将在 register方法之前执行
System.out.println("getList......");
User u1 = new
User(1,"aaa",20,new Date());
User u2 = new
User(2,"bbb",30,new Date());
User u3 = new
User(3,"ccc",40,new Date());
List<User>
list = new ArrayList<User>();
list.add(u1);
list.add(u2);
list.add(u3);
exceptionHandler(Exception
e){
System.out.println(e.getMessage());
return "exception.jsp";
}
5 spring MVC 文件上传
commons-fileUpload.jar
commons-io.jars
<!-- 配置文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="utf-8">
</bean>
单个文件上传
@RequestMapping
public String
upload(HttpServletRequest request) throws
Exception{
MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;
MultipartFile mf = req.getFile("myFile");
System.out.println(mf.getName());
System.out.println(mf.getOriginalFilename());
System.out.println(mf.getSize());
InputStream is = mf.getInputStream();
String
folderPath =
request.getSession().getServletContext().getRealPath("/upload");
OutputStream
os = new
FileOutputStream(folderPath+"/"+mf.getOriginalFilename());
int len=0; byte[] b = new byte[1024];
while((len=is.read(b))>0){
os.write(b, 0, len); }
is.close();
os.close();
return "success.jsp";
}
多文件上传:
public String
upload(HttpServletRequest request,ModelMap model) throws Exception{
MultipartHttpServletRequest req =
(MultipartHttpServletRequest)request;
List<MultipartFile> list = req.getFiles("myFile");
String folderPath =
request.getSession().getServletContext().getRealPath("/upload");
for(MultipartFile
mf:list){
if(!mf.isEmpty()){
OutputStream os = new
FileOutputStream(folderPath+"/"+mf.getOriginalFilename());
InputStream is = mf.getInputStream();
byte[] b = new byte[1024];
int len = 0;
while((len=is.read(b))>0){
os.write(b, 0, len);
}
is.close();
os.close();
System.out.println(mf.getName());
System.out.println(mf.getOriginalFilename());
}
}
return "success.jsp";
}
验证:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="utf-8">
<property
name="maxUploadSize">
<value>200000000000</value>
</property>
</bean>
<!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException
-->
<!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property
name="exceptionMappings">
<props>
<!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload.jsp</prop>
</props>
</property>
</bean>
6 spring MVC拦截器
自定义拦截器的两种方式:
1 实现HandlerInterceptor
public class
MyInterceptor implements
HandlerInterceptor {
@Override
public boolean
preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
//Object arg2 指的是下一个拦截器对象
System.out.println("Controller之前执行...");
return true;
}
@Override
public void
postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("controller之后,生成视图之前执行");
}
@Override
public void afterCompletion(HttpServletRequest
arg0,
HttpServletResponse arg1, Object arg2,
Exception arg3)
throws Exception {
System.out.println("最后执行,一般用来释放资源");
}
}
2 继承 HandlerInterceptorAdapter
可以指定覆盖哪个方法
拦截器定义完成后,需要在配置文件中声明
<mvc:interceptors>
<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
<bean class="web.interceptor.MyInterceptor"/>
<mvc:interceptor>
<mvc:mapping
path="/RegisterController.do"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="web.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
7 spring MVC 返回JSON数据
Controller 返回json格式数据:
1 导入jar包
jackson-core-asl.jar
jackson-mapper-asl.jar
2 修改spring MVC 配置文件
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property
name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property
name="supportedMediaTypes">
<list>
<value>text/html;
charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
3
controller中:
@RequestMapping
public @ResponseBody
List<User> test(String name){
System.out.println(name+"-------------");
User u1 = new User("aaa","123",20);
User u2 = new User("bbb","345",21);
User u3 = new User("ccc","234",22);
List<User> list = new
ArrayList<User>();
list.add(u1);list.add(u2);list.add(u3);
return list;
}
SpringMVC详细学习笔记的更多相关文章
- Hbase技术详细学习笔记
注:转自 Hbase技术详细学习笔记 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行 ...
- 基于【 MySql 】二 || mysql详细学习笔记
mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...
- SpringMVC框架学习笔记(6)——拦截器
SpringMVC拦截器需要实现接口HandlerInterceptor 有3个方法,分别在请求处理前.请求处理后和在DispatcherServlet处理后执行 实现代码: package inte ...
- SpringMVC框架学习笔记(1)——HelloWorld
搭建SpringMVC框架 1.添加jar包 jsp-api.jar servlet-api.jar jstl.jar commons-logging-1.1.1.jar spring-beans-4 ...
- SpringMVC框架学习笔记(2)——使用注解开发SpringMVC
1.配置web.xml <servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.sp ...
- SpringMVC框架学习笔记(4)——结果跳转方式
1.设置ModelAndView对象.根据View和视图解析器跳转到指定页面(视图解析器前缀+viewname+视图解析器后缀) @Override public ModelAndView handl ...
- MySQL 详细学习笔记 转
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- 一千行 MySQL 详细学习笔记
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
- MySQL 详细学习笔记
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...
随机推荐
- vim编辑器-多行加注释与去注释
在使用vim编辑器时,有时候需要对多行代码进行加注释或去注释,下面将介绍两种方法. 方法一:块选择模式 1. 插入注释 (1)首先按键盘上的ESC进入命令行模式 (2)再按Ctrl+V进入VISUAL ...
- HDU 6521 Party
6521 思路: 线段树玄学剪枝, 俗称吉司机线段树. 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize ...
- (5)TCP和UDP协议
TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览 ...
- pom.xml配置,针对mvn clean install -P参数(环境参数)打包
pom.xml配置,针对mvn clean install -P参数(环境参数)打包 比如你有2个环境,一个dev,一个prod, 然后你在mvn打包的时候,可以通过-P来打包,是打dev包,还是pr ...
- ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置
背景: 由于本人使用的是6.0以上的版本es,在使用发现很多中文博客对于mapping参数的说明已过时.ES6.0以后有很多参数变化. 现我根据官网总结mapping最新的参数,希望能对大家有用处. ...
- tomcat 中项目配置文件统一目录设置
在tomcat 安装目录中 conf 下的 catalina.properties 文件中 有个 shared.loader= 配置为 shared.loader="${catali ...
- UML图概述
UML图概述 UML是一种分析设计语言,即一种建模语言.UML是由图形符号表达的建模语言,其结构主要包括视图.图.模型元素和通用机制四部分. UML包括5种视图,分别是用户视图.结构视图.行为视图.实 ...
- Shovel Sale CodeForces - 899D (数位dp)
大意: n把铲子, 价格1,2,3,...n, 求有多少个二元组(x,y), 满足x+y末尾数字9的个数最多. 枚举最高位, 转化为从[1,n]中选出多少个二元组和为$x$, 枚举较小的数 若$n\g ...
- JavaScript进阶系列1:performace和console.time性能测试
测试性能的时候,三种方法: 1.使用new Date() 返回整数值ms var dtStart=new Date(); for(var i=0;i<15000;i++){ i=i; } var ...
- Log4Net 记录错误日志。
点击进入推荐链接 1.先添加log4net.dll的引用. 2.在程序入口的地方(Gloabal文件)加上这句log4net.Config.XmlConfigurator.Configure(). ...