spring mvc 学习1

一:什么是spring mvc

Springmvc是一个webmvc框架

JAVAEE体系结构

 spring mvc 学习1

什么是mvc

Model1

 spring mvc 学习1

Model2

 spring mvc 学习1

Springmvc执行流程

spring mvc 学习1

注:以上3步骤,返回的是一个chain链,连中包含了拦截器还有需要执行的action,

2:spring mvc的开发步骤:

①:

创建一个web工程

 spring mvc 学习1

导入jar

 spring mvc 学习1

 

配置web.xml

web.xml配置前端控制器:DispatcherServlet

 spring mvc 学习1

注:1:以上配置了前端控制器:DispatcherServlet,指定了前端控制器的加载路径classpath:springmvc.xml(如果不指定,则会使用默认的文件,默认为springmvc(该springmvc即为以上配置的servlet-name前端控制值名称)-servlet.xml,且必须在WEB-INF目录下)

2:以上的前端控制器名字定为springmvc,在下面的拦截*。do中servlet-name也必须为springmvc,*。do表示会拦截后缀为.do的请求,只有这样的请求才会进入到这个前端控制器中去

二:配置springmvc.xml

spring mvc 学习1

注:springmvc.xml(springmvc配置文件)中需要配置处理器映射器,处理器适配器,视图解析器,(以上三个配置的都是默认的)在以上的文件中还定义了一个bean,name ="/hello.do",表示发送前端请求的时候hello.do的请求会被前端控制器DispatcherServlet拦截并适配到这个bean,触发执行任务。以上的视图解析器中定义的前缀为/web-inf/jsps/,表示所有返回的jsp页面都会在这个路径下,后缀名。jsp也是相同意义

以下为上图配置的bean的实现类,发送hello.do会到该类(myController)中来执行:返回modelAndView,携带了一个key,value,(hello,欢迎学习springmvc),返回到index页面,modelAndView字面意思就是一个model和一个视图view,mv.addobject就是添加一个model,mv.setViewName就是设置一个要返回的视图,由于上面的spring mvc.xml中配置了前缀(/web-inf/jsps/)和后缀(.jsp),所以该类中返回的虽然为index,但实际上地址为/web-inf/jsps/index.jsp

定义视图页面

根据视图解析路径:WEB-INF/jsps/index.jsp

spring mvc 学习1

定义视图页面

根据视图解析路径:WEB-INF/jsps/index.jsp

spring mvc 学习1

spring mvc 学习1

注:前端index中获取返回的数据:使用${hello},hello为执行Controller而返回来的值;

根据代码分析springmvc执行流程

spring mvc 学习1



三:处理器映射器

1:BeanNameUrlHandlerMapping

之前的处理器映射器使用的是beanNameUrlHandlerMapping,只能一个个定义,麻烦:

功能:寻找Controller

  根据url请求去匹配beanname属性url,从而获取Controller

spring mvc 学习1

2:SimpleUrlHandlerMaping

功能寻找Controller

  根据浏览器url匹配简单urlkeykeyControllerid找到Controller

spring mvc 学习1

3:ControllerClassNameHandlerMapping

功能寻找Controller

   根据类名(MyController类名.do来访问,类名首字母小写

spring mvc 学习1

映射之间能不能共存?

3处理器映射器可以共存。

四:处理器适配器:

1:SimpleControllerHandlerAdapter

功能:执行controller

调用controller里面方法,返回modelAndView

spring mvc 学习1

该适配器只能执行实现了Controller接口的controller类中的方法。运用了适配器模式

适配器源码

spring mvc 学习1

 

2:HttpRequestHandlerAdapter

功能:执行controller,

spring mvc 学习1

spring mvc 学习1

通过实现HttpRequestHandler接口,只能访问实现HttpRequestHandler接口的controller类,且通过response.setAttribute()和跳转地址来实现取值和地址。

2处理器适配器能共存?

可以共存

五:命令控制器

Springmvc通过命令设计模式接受页面参数。

自定义命令控制器

spring mvc 学习1

注:以上将指定参数(command)绑定到User的javabean

跳转后的index页面:

spring mvc 学习1

定义javaBean

spring mvc 学习1

封装参数页面

spring mvc 学习1

跳转add页面

由于add页面在WEB-INF下面不能直接访问,需要通过Controller来访问。

spring mvc 学习1

springmvc配置bean

spring mvc 学习1



中文乱码解决

spring mvc 学习1

Post乱码

Spring编码过滤器:web.xml配置

spring mvc 学习1

六:时间类型转换

当从前端网页上传的时间类型与本地时间格式不符合,比如上传1993-03-01.而本地时间格式为1993/03/01,这样就会出现问题,解决的办法是重写initbinder方法,该方法会被springmvc自动加载,且会在Controller之前加载:

spring mvc 学习1



七:注解开发

创建一个web工程,并导入jar

spring mvc 学习1

配置web.xml

//此为post请求的编码过滤器

<filter>

  <filter-name>characterEncoding</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>characterEncoding</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

  //加载springmvc

  <servlet>

  <servlet-name>springmvc</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <!-- 默认加载方式

     默认加载必须规范:

     * 文件命名:servlet-name-servlet.xml====springmvc-servlet.xml

     * 路径规范:必须在WEB-INF目录下面

   -->

   <init-param>

   <param-name>contextConfigLocation</param-name>

   <param-value>classpath:springmvc.xml</param-value>   

   </init-param>

  </servlet>


  <servlet-mapping>

  <servlet-name>springmvc</servlet-name>

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

配置springmvc配置文件

//配置扫描路径,这样路径下的类就会自动被spring所管理

<context:component-scan base-package="cn.itcast"></context:component-scan>

<!-- 配置注解处理器映射器

功能:寻找执行类Controller

-->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

<!-- 配置注解处理器适配器

功能:调用controller方法,执行controller

-->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

<!-- 配置sprigmvc视图解析器:解析逻辑试图

 后台返回逻辑试图:index

视图解析器解析出真正物理视图:前缀+逻辑试图+后缀====/WEB-INF/jsps/index.jsp

-->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsps/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

自定义Controller

spring mvc 学习1

spring mvc 学习1

@Controller注解类似于在springmvc.xml中配置了bean.

注解开发流程

spring mvc 学习1

1:注解写法

RequestMapping

requestMapping(“hello”)可以匹配任何扩展名比如:hello.do,hello.html

requestMapping(“/hello.do”)

requestMapping(value=”/hello.do”)

spring mvc 学习1

2:注解写法,指定提交方式

requestMapping(value=”/hello.do”,method=RequestMethod.GET)

spring mvc 学习1

requestMapping(value=”/hello.do”,method=RequestMethod.POST)

浏览器直接访问,a标签都是get请求

表单提交(指定post)ajax指定post提交,post提交。

//默认的浏览器访问是get请求,而Controller指定的为post,所以会报错

spring mvc 学习1

spring mvc 学习1

3:两种提交方式都支持

requestMapping(value=”/hello.do”,method={RequestMethod.POST, RequestMethod.GET})

spring mvc 学习1



RequestMaping根路径

@RequestMapping”/user”

UserController

requestMapping(“save”)

Save()

requestMapping(“update”)

Update{}

requestMapping(“find”)

Fiind()

 

项目名/user/save.do

@RequestMapping”/items”

ItemsController

 

requestMapping(“save”)

Save()

requestMapping(“update”)

Update{}

requestMapping(“find”)

Fiind()

 

 

项目/items/save.do

 

自定义根路径

spring mvc 学习1


八:springmvc封装参数:

springmvc没有成员变量,把需要传递参数对象放入方法中,当你请求这个方法的时候,方法里面的对象会自动 被创建,需要封装的参数会自动被封装方法的对象,

封装参数

分析接受参数类型:

基本类型,intString等等基本类型。

Pojo类型

包装类型

Springmvc默认支持类型:

HttpSessionHttpRequstServletModel等等

Struts2参数:基于属性封装。

Springmvc参数封装:基于方法进行封装。

1:基本类型

需求

封装int类型参数

页面

页面传递参数都是字符串。

spring mvc 学习1

接受参数方法

spring mvc 学习1

2:接受字符串类型

页面

spring mvc 学习1

代码

spring mvc 学习1

3:接受数组

分析批量删除:checkbox复选框。Value必须有值。

 

页面

spring mvc 学习1

代码


spring mvc 学习1

4:接受Pojo

spring mvc 学习1

页面

spring mvc 学习1

代码

spring mvc 学习1

5:接受包装类型参数

userCustom

private user user

private List<User> userList;

private Map<K,V> maps;

private items items;

定义UserCustom:包含user,以及map,list

spring mvc 学习1


页面

spring mvc 学习1

代码

spring mvc 学习1

接受集合类型参数

接受list集合

spring mvc 学习1

代码

spring mvc 学习1

接受map

页面

spring mvc 学习1

代码

spring mvc 学习1

 

有了struts2,为什么还需要sprigmvc

实现机制:

Struts2基于过滤器实现的。

Springmvc基于servlet实现。Servlet比过滤器快。

 

运行速度:

Struts2多列

请求来了以后,struts2创建多少个对象

ActionContextvaluestackUserActionActionSuportModelDriven

userAction里面属性:User对象,userlist集合等

 

Springmvc是单列。

 

 

参数封装来分析

Struts基于属性进行封装

Springmvc基于方法封装


九:页面回显

spring中使用model对象,model对象相当于application,可以使用el表达式来获取

1:查询所有

@RequestMapping("list")

public String list(Model model){

//model相当于application域对象

List<User> userList = new ArrayList<User>();

User user1 = new User();

user1.setId(1);

user1.setSex("");

user1.setUsername("张山峰");

user1.setAddress("武当山");

user1.setBirthday(new Date());

User user2 = new User();

user2.setId(2);

user2.setSex("2");

user2.setUsername("张山峰222");

user2.setAddress("武当山222");

user2.setBirthday(new Date());

User user3 = new User();

user3.setId(3);

user3.setSex("3");

user3.setUsername("张山峰333");

user3.setAddress("武当山333");

user3.setBirthday(new Date());

userList.add(user1);

userList.add(user2);

userList.add(user3);

model.addAttribute("userList", userList);

return "list";

}

页面获取

spring mvc 学习1

2:修改

spring mvc 学习1

修改代码

spring mvc 学习1

回显

spring mvc 学习1

十:restful风格的实现

普通的请求路径后面会加上问号?,然后后面跟上传递的值,然后后端获取,如下所示,

spring mvc 学习1


但是restful风格的实现:

1:在springmvc.xml文件中添加,添加拦截/rest/*类的实现,这样可以做到比如对于外网显示的可以采用restful风格,对内就可以采用别的风格。

spring mvc 学习1

2:传递的参数值直接加载在露筋后方,而不需要?连接

spring mvc 学习1

{}:匹配接受页面Url路径参数

@Pathariable{}里面参数注入后面参数里面

spring mvc 学习1

以上则实现了restful风格

URL模版映射

url模版映射可以restfull软件架构

url模版映射过程

spring mvc 学习1

requestparam:下面的使用方式为:前台传值名称name需为group,后台使用该名陈为groupid.

spring mvc 学习1


十一:转发和重定向:

1:转发

关键字forward

本类进行转发:

一个类中方法方法之间进行forward

转发方式:

方式一:return ”forwardlist.do“

代码

spring mvc 学习1


跨类进行转发:

转发方式:return ”forward/items/list.do“

spring mvc 学习1

2:重定向

关键字redirect

本类进行重定向

本类方法方法之间进行redirect

重定向方式:

方式一:return ”redirectlist.do“

spring mvc 学习1

跨类进行重定向

转发方式:return ”redirect/items/list.do“


spring mvc 学习1