spring mvc 学习1
一:什么是spring mvc
Springmvc是一个web层mvc框架
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请求去匹配bean的name属性url,从而获取Controller
2:SimpleUrlHandlerMaping
功能:寻找Controller
根据浏览器url匹配简单url的key,key又Controller的id找到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没有成员变量,把需要传递参数对象放入方法中,当你请求这个方法的时候,方法里面的对象会自动 被创建,需要封装的参数会自动被封装方法的对象,
封装参数
分析接受参数类型:
基本类型,int,String等等基本类型。
Pojo类型
包装类型
Springmvc默认支持类型:
HttpSession,HttpRequstServlet,Model等等。
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创建多少个对象:
ActionContext,valuestack,UserAction,ActionSuport,ModelDriven
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 ”forward:list.do“;
代码:
跨类进行转发:
转发方式:return ”forward:/items/list.do“;
2:重定向
关键字:redirect
本类进行重定向:
本类方法与方法之间进行redirect
重定向方式:
方式一:return ”redirect:list.do“;
跨类进行重定向:
转发方式:return ”redirect:/items/list.do“;