菜鸟程序猿之SpringMVC入门
SpringMVC
一、Servlet的缺点:
1、xml配置繁琐
一个Servlet必须配置8行,这样的配置太繁琐。
2、servlet类中方法单一
在servlet中只有两个方法 doget() dopost().通常情况下。一个servlet只能执行一个方法。
例如addUserServlet, updateUserServlet .这样写一张表的增删改查就会出现至少4个servlet.这两个方法结构单一 作用就是传递页面参数。
3、获取的值只能是String
可以通过request对象获取页面传入的值,但是传入值的类型只能是字符串。如果是其他类型,必须通过类型转化的方式进行转换。
二、SpringMVC
SpringMVC是一个前端控制框架。是Spring家族中的一个组件。与spring可以做到无缝整合。而且写法简单,类型可以随意接收。就是MVC设计模式中的Controller
1、整个SpringMVC的核心调用过程
★核心内容:
一个控制器:前端控制器
3个适配器:处理器映射器 处理器适配器 视图解析器
★调用过程:
1. 用户发起请求,请求到DispatcherServlet前端控制器
DispatcherServlet(*调度),负责request和response,负责调用处理器映射器查找Handler,负责调用处理器适配器执行Handler,
有了前端控制器降低了各各组件之间的耦合性,系统扩展性提高。
2. DispatcherServlet前端控制器请求处理器映射器HandlerMapping查找Handler
根据用户请求的url,根据一定的规则去查找(比如:xml配置,注解)
3. HandlerMapping处理器映射器将Handler返回给前端控制器
4. DispatcherServlet前端控制器调用HandlerAdapter处理器适配器执行Handler
程序员编写的Handler是按照适配器要求的规则去执行Handler
5. HandlerAdapter处理器适配器执行Handler
适配器按照一定规则去执行Handler
6. Handler执行完成,返回ModelAndView
ModelAndView是springmvc的封装对象,将model和view封装在一起。
7. HandlerAdapter处理器适配器将ModelAndView返回给前端 控制器
8. 前端控制器调用视图解析器,进行视图解析,解析完成给前端控制器返回View
View是springmvc的封装对象,是一个接口,实现类包括jspview,pdfview。。。。
9. 前端控制器调用view进行视图渲染
将模型数据填充到view(将model数据填充到request)响应给用户
10、前端控制器响应给用户。
2、具体实现
★导入jar包
★配置前端控制器
★配置springMVC的核心配置文件
springmvc(Servlet-name)-servlet.xml
★配置映射关系
<bean name="/hello.action" class="controller.HelloController"></bean>
★编写Controller
如果使用默认的处理器适配器就需要实现一个Controller接口 并且返回modelAndView对象。
modelAndView对象需要两个值
一个是model 就是服务的数据。
一个是view 就是页面名称。
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀 -->
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
★配置视图解析器
作用:将modelAndView对象中的view进行拼接找到具体的页面路径
前缀+页面名称+后缀
/WEB-INF/hello.jsp
3、SpringMVC的核心配置文件
★首先找到<servlet-name>springmvc</servlet-name>
拿到springmvc之后 拼接(-servlet.xml) 形成springmvc-servlet.xml
★/WEB-INF的好处
放入到web-inf下浏览器不能直接访问。需要通过程序内部跳转才是实现浏览功能
★SpringMVC的配置文件的位置
放到web-inf 下程序手动调用时不可能引入的。所有通常情况下把配置文件放入到src/
<!--指定springmvc核心配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc-servlet.xml</param-value>
</init-param>
4、SpringMVC的注解形式
★开启注解
<!--开启springMVC的注解 -->
<mvc:annotation-driven/>
<!--开启类扫描 -->
<context:component-scan base-package="controller"/>
★指明映射关系
@RequestMapping(value="hello.action")
public String hello(Model model){
System.out.println("客户端成功调用");
model.addAttribute("msg", "注解形式实现SpringMVC");
//返回的字符串就是返回的页面名称
return "hello";
}
通过RequestMapping(URL) 可以与方法进行匹配。如果url能够匹配成功就会执行相应的方法。方法的返回值就是页面的名称。
Model对象就是用来为页面赋值的。其实底层就是request域。通过request进行数据的传递。
5、页面中参数的接收
通过form表单提交的内容可以实现自动的赋值。但是前提条件是
<input name="password" type="password"/> input元素中name属性的值 必须与SpringMVC接收参数的名称一致。
6、通过对象接收参数
首先拿到form表单中的所有的提交的元素名称 按照名称与对象中的set方法匹配。如果匹配成功,则正确赋值。
7、为对象的引入赋值
<tr>
<td>电话:</td>
<td><input name="userInfo.tel" type="text"/></td>
</tr>
8、日期的转换
如果没有进行日期格式的设定就会出现类型转化错误-400。
@org.springframework.web.bind.annotation.InitBinder
public void InitBinder (ServletRequestDataBinder binder){
binder.registerCustomEditor(java.util.Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
只要在当前的Controller中添加日期转换格式 就能实现日期正确转化。
9、同名属性提交
如果是同属性提交时,如果接收参数类型是String 那么就是把提交的属性进行拼接,中间用“,”号隔开。
10、提交的name和参数名称不匹配
如果参数与提交值的name属性不一致 可以通过
@RequestParam(value="hobby") String[] hobbys
可以吧 hobby中的参数 转化为 hobbys
11、重定向
页面如果要实现跳转 需要用到重定向
redirect:/toUserList.action
浏览器的地址栏会改变,当前request域中的数据不能传递。
12、转发
forward:/toUserList.action
★浏览器的地址不变。
★request域中的数据可以继续传递。
<!--配置文件上传解析器
id的名称必须为:multipartResolver ····写死
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
bean中的ID不能随便修改
13、SpringMVC的文件上传
★编写Controller
FileUtils.writeByteArrayToFile(new File("D:\\图片样例\\"+file.getOriginalFilename()), file.getBytes());
★开启文件上传解析器
★页面提交设置
必须添加enctype="multipart/form-data" 才能实现文件上传。
14、RestFul结构
相对于get提交而言 XXX.action?name=tom&age=19
使用restful结构 XXX/tom/19.action
resuFul结构对数据的传递 只需要传递数据的值。不需要传递值的名称,这样能够实现效率更快。
实现方式:
@RequestMapping(/hello/{id})
小结
谢谢观赏,我是正在奔跑的程序猿。
上一篇: JAVA学习笔记之字符串