spring mvc 学习1

一:什么是spring mvc

Springmvc是一个webmvc框架

JAVAEE体系结构

 

什么是mvc

Model1

 

Model2

 

Springmvc执行流程

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

2:spring mvc的开发步骤:

①:

创建一个web工程

 

导入jar

 

配置web.xml

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

 

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

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

二:配置springmvc.xml


注: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


定义视图页面

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


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

根据代码分析springmvc执行流程



三:处理器映射器

1:BeanNameUrlHandlerMapping

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

功能:寻找Controller

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


2:SimpleUrlHandlerMaping

功能寻找Controller

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

3:ControllerClassNameHandlerMapping

功能寻找Controller

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


映射之间能不能共存?

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

四:处理器适配器:

1:SimpleControllerHandlerAdapter

功能:执行controller

调用controller里面方法,返回modelAndView

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

适配器源码


 

2:HttpRequestHandlerAdapter

功能:执行controller,


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

2处理器适配器能共存?

可以共存

五:命令控制器

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

自定义命令控制器


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

跳转后的index页面:


定义javaBean

封装参数页面


跳转add页面

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


springmvc配置bean



中文乱码解决

Post乱码

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



六:时间类型转换

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




七:注解开发

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

配置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

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

注解开发流程

1:注解写法

RequestMapping

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

requestMapping(“/hello.do”)

requestMapping(value=”/hello.do”)

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

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

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

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

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

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

3:两种提交方式都支持

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




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

 

自定义根路径


八:springmvc封装参数:

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

封装参数

分析接受参数类型:

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

Pojo类型

包装类型

Springmvc默认支持类型:

HttpSessionHttpRequstServletModel等等

Struts2参数:基于属性封装。

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

1: 基本类型

需求

封装int类型参数

页面

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

接受参数方法

2:接受字符串类型

页面

代码

3:接受数组

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

页面

代码


4:接受Pojo


页面

代码


5:接受包装类型参数

userCustom

private user user

private List<User> userList;

private Map<K,V> maps;

private items items;

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



页面


代码


接受集合类型参数

接受list集合

代码

接受map

页面

代码

 

有了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";

}

页面获取


2:修改

修改代码

回显

十:restful风格的实现

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



但是restful风格的实现:

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


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

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

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

以上则实现了restful风格

URL模版映射

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

url模版映射过程

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



十一:转发和重定向:

1:转发

关键字forward

本类进行转发:

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

转发方式:

方式一:return ”forwardlist.do“

代码


跨类进行转发:

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



2:重定向

关键字redirect

本类进行重定向

本类方法方法之间进行redirect

重定向方式:

方式一:return ”redirectlist.do“

跨类进行重定向

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






猜你喜欢

转载自blog.csdn.net/qq_32784541/article/details/79773292