Spring MVC

 

1 spring MVC简介:

 

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。

2 SpringMVCstruts2的区别

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详细学习笔记的更多相关文章

  1. Hbase技术详细学习笔记

    注:转自 Hbase技术详细学习笔记 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行 ...

  2. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  3. SpringMVC框架学习笔记(6)——拦截器

    SpringMVC拦截器需要实现接口HandlerInterceptor 有3个方法,分别在请求处理前.请求处理后和在DispatcherServlet处理后执行 实现代码: package inte ...

  4. SpringMVC框架学习笔记(1)——HelloWorld

    搭建SpringMVC框架 1.添加jar包 jsp-api.jar servlet-api.jar jstl.jar commons-logging-1.1.1.jar spring-beans-4 ...

  5. SpringMVC框架学习笔记(2)——使用注解开发SpringMVC

    1.配置web.xml <servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.sp ...

  6. SpringMVC框架学习笔记(4)——结果跳转方式

    1.设置ModelAndView对象.根据View和视图解析器跳转到指定页面(视图解析器前缀+viewname+视图解析器后缀) @Override public ModelAndView handl ...

  7. MySQL 详细学习笔记 转

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  8. 一千行 MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

  9. MySQL 详细学习笔记

    Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值 ...

随机推荐

  1. winform SerialPort串口通信问题

    一.串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串 ...

  2. jquary高级和ajax

    jquary高级: 1.动画 1.三种方式显示与隐藏元素 1.默认显示和隐藏的方式 1.show([speed],[easing],[fn]):显示 [speed],[easing],[fn] spe ...

  3. caffe分类

    1.制作数据  标签   label.bat dir/s/on/b >.txt 2.制作lmdb     convert_lmdb.bat SET GLOG_logtostderr= E:\ca ...

  4. javascript高级程序设计第3版——第1Java章 DOM扩展

    虽然DOM 为与XML 及HTML 文档交互制定了一系列核心API,但仍然有几个规范对标准的DOM进行了扩展.这些扩展中有很多原来是浏览器专有的,但后来成为了事实标准,于是其他浏览器也都提供了相同的实 ...

  5. js里面对数据处理的方法

      1,charAt()方法可返回指定位置的字符 JavaScript String 对象 例:stringObject.charAt(index) index:表示字符串中某个位置的数字,即字符在字 ...

  6. WinForm界面设计优化过程

    以在做的项目为例,记录一下界面美化过程中遇到的问题,由于项目是先做出来之后,又请美工进行稍微调整设计界面,所以会又些限制 1. TabControl的问题----在添加了背景图片后,TabContro ...

  7. ZedBoard前期准备工作

    1. 资源下载 内核:https://github.com/Xilinx/linux-xlnx/releases uboot:https://github.com/Xilinx/u-boot-xlnx ...

  8. 微信小程序开发学习(一):开发前准备

    开发前准备 Step1:注册 微信小程序开放平台: https://mp.weixin.qq.com/cgi-bin/wx 开发者注册: https://mp.weixin.qq.com/wxopen ...

  9. css--父元素塌陷

    当父元素内都是漂浮元素时,会造成父高度塌陷的问题.(因为等同于父元素内容为空,所以长,宽都等于空) 我们想要的页面结构是: <!DOCTYPE html> <html lang=&q ...

  10. 爬取字段和图片 spider_getModelInformation

    import urllibimport urllib2import re class Spider: def getPage(self,pageIndex): url="http://mm. ...