SpringMVC学习笔记_01

1、JAVAEE体系结构 JAVAEE体系结构图如下所示: 2、什么是springmvc? 什么是mvc? Model1 Model2 SpringMVC是什么? SpringMVC是一个web层mvc框架,类似struts2。 SpringMVC和Spring? Springmvc是Spring的组成部分。 SpringMVC执行流程(运行原理) 回忆Struts2执行流程: 前端控制器:StrutsPrepareAndExcuteFilter拦截请求(控制层):拦截请求,转发请求 寻找Action执行,处理请求数据 ActionMapping去寻找执行类Action --> UserAction 找到ActionProxy:StrutsActionProxy extends DefaultActionProxy 通过代理类ActionProxy根据struts.xml寻找到真正的执行类Action SpringMVC执行流程(运行原理),如下图所示: 3、springmvc第一个程序案例 3.1、不使用jsp视图解析器+使用jsp视图解析器 (1)使用eclipse,创建一个动态的web工程   其中Dynamic web module version版本选择 2.5,这样兼容性好一些;   Default output folder设置为 WebRoot\WEB-INF\classes;   Content directory设置为 WebRoot;   更改JRE System Library[J2SE-1.5]为 JRE System Library[jre1.7.0_80];   删掉没用的库:EAR Libraries;   增加服务器运行环境库 Server Runtime,不然jsp文件会报错。   创建完项目后,将整个项目的编码改为UTF-8。   操作步骤:选中项目右键 --> Properties --> Resource --> Text file encoding --> Other中选择UTF-8。   对于动态的java web项目,为了工程目录结构的清爽,我们将引入的jar包放到“Web App Libraries”中,可以通过“小三角”选择是否“Show 'Referenced Libraries' Node ”进行调节。   对于普通的java项目,为了工程目录结构的清爽,我们将引入的jar包放到“Referenced Libraries”中,可以通过“小三角”选择是否“Show 'Referenced Libraries' Node ”进行调节。 (2)导入springmvc的jar包   本案例共16个jar,如下图所示: (3)在web.xml配置前端控制器:DispatcherServlet(入口) springmvc org.springframework.web.servlet.DispatcherServlet springmvc *.do   我们还需要配置springmvc.xml文件的初始化参数,如下图所示: (4)配置springmvc.xml   参考文件位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html (5)自定义Controller(相当于Struts2里面的Action) public class UserController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 接收请求,接收参数,验证参数,处理请求 // 封装参数,调用业务方法,返回处理结果数据ModelAndView // 演示案例中我们只模拟下而已:向前台返回数据 ModelAndView mv = new ModelAndView(); mv.addObject("hello", "like xiaoyi"); // 指定跳转的视图 // 返回真实的物理视图,省略了8、9步 // mv.setViewName("/WEB-INF/jsps/index.jsp"); // 返回逻辑视图 mv.setViewName("index"); return mv; } } (6)定义视图页面   根据视图解析路径:WEB-INF/jsps/index.jsp

${hello}

(7)浏览器访问   访问地址:http://localhost:8080/day63_SpringMVC_01/hello.do 4、根据程序分析springmvc执行流程(画图) 该图同SpringMVC执行流程图(运行原理) 5、处理器映射器 5.1、配置默认处理器映射器(BeanNameUrlHandlerMapping) 功能:寻找Controller    根据url请求去匹配bean的name属性url,从而获取Controller 5.2、配置集中处理器映射器(SimpleHandlerMapping) 功能:寻找Controller    根据浏览器url匹配简单url的key,key通过Controller的id找到Controller 5.3、配置类名处理器映射器(ClassNameHandlerMapping) 功能:寻找Controller    直接根据类名(UserController),类名.do来访问,类名首字母小写 3个处理器映射器可以共存。均可以访问成功。 6、处理器适配器 6.1、配置默认处理器适配器(SimpleControllerHandlerAdapt) 功能:执行Controller    负责执行实现了Controller接口的后端控制器,例如:UserController,调用Controller里面的方法,返回ModelAndView。 默认处理器适配器源码分析,如下图所示: 6.2、配置请求处理器适配器(HttpRequestHandlerAdapter) 功能:执行Controller    负责执行实现了HttpRequestHandler接口的后端控制器。 演示过程:   自定义实现了接口HttpRequestHandler的实现类HttpController,如下图所示:   在springmvc.xml中配置自定义的bean,即自定义的HttpController,如下图所示:   上面的这种方式无限接近servlet的开发。 2个处理器适配器可以共存。 7、命令控制器 7.1、Controller简介 1、收集、验证请求参数并绑定到命令对象; 2、将命令对象交给业务对象,由业务对象处理并返回模型数据; 3、返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分是逻辑视图名)。 普通控制器(继承接口Controller,继承接口HttpRequestHandler) 命令控制器(继承抽象类AbstractCommandController) 例子:跳转到添加页面,进行页面跳转,参数提交get请求或者post请求 参数控制器(类ParameterizableViewController) Springmvc通过命令设计模式接受页面参数。 7.2、演示:自定义命令控制器 示例如下: (1)自定义命令控制器 package com.itheima.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractCommandController; import com.itheima.domain.User; // 从页面接收参数,封装到JavaBean中,本例中的JavaBean是User @SuppressWarnings("deprecation") public class CommandController extends AbstractCommandController { // 指定把页面传过来的参数封装到对象,使用命令设计模式 public CommandController() { this.setCommandClass(User.class); } @Override protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { // 参数被封装进命令对象,这个过程很复杂,我们暂时不用管它,只要知道它使用的是命令设计模式即可 // 把命令对象强转成User对象 User user = (User) command; // 设置Model的数据,值可以是任意pojo ModelAndView mv = new ModelAndView(); mv.addObject("user", user); // 指定返回页面 mv.setViewName("index"); return mv; } } (2)定义javaBean package com.itheima.domain; import java.util.Date; public class User { private Integer id; private String username; private String age; private Date birthday; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } (3)封装参数页面   文件位置:/day63_SpringMVC_01/WebRoot/WEB-INF/jsps/add.jsp add.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here
姓名:
年龄:
生日:
地址:
(4)获取参数页面   文件位置:/day63_SpringMVC_01/WebRoot/WEB-INF/jsps/index.jsp index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here

${user.username}---${user.age}---${user.birthday}---${user.address}

(5)跳转到add页面   由于add页面在WEB-INF下面不能直接访问,需要通过Controller来访问。 package com.itheima.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class ToAddController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 跳转到add页面 ModelAndView mv = new ModelAndView(); mv.setViewName("add"); return mv; } } (6)在springmvc.xml中配置bean 7.3、中文乱码解决 (1)解决get请求乱码   配置tomcat的编码,如下图所示: (2)解决post请求乱码   在web.xml中,配置spring编码过滤器,如下所示: characterEcoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 characterEcoding /* 7.4、时间类型转换   在CommandController类中重写initBinder()方法,示例代码如下: // 从页面接收参数,封装到JavaBean中,本例中的JavaBean是User @SuppressWarnings("deprecation") public class CommandController extends AbstractCommandController { // 指定把页面传过来的参数封装到对象,使用命令设计模式 public CommandController() { this.setCommandClass(User.class); } @Override protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { // 参数被封装进命令对象,这个过程很复杂,我们暂时不用管它,只要知道它使用的是命令设计模式即可 // 把命令对象强转成User对象 User user = (User) command; // 设置Model的数据,值可以是任意pojo ModelAndView mv = new ModelAndView(); mv.addObject("user", user); // 指定返回页面 mv.setViewName("index"); return mv; } @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { String str = request.getParameter("birthday"); if (str.contains("/")) { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"), true)); } else { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); } } } 7.5、参数控制器ParameterizableViewController   在springmvc.xml中配置参数控制器 注意:使用参数控制器:不用自己定义Controller了,可以直接使用toIndex.do进行访问。 8、注解开发 8.1、注解开发第一个入门程序 步骤如下: 创建一个动态的web工程,导入jar文件 配置web.xml 配置springmvc.xml文件:配置处理器映射器、配置处理器适配器、配置jsp视图解析器 自定义Controller类,使用注解开发:添加,返回到成功页面进行回显,点击修改回到添加页面,初步理解参数传递。 (1)创建一个动态的web工程,导入jar文件   详细过程同3、springmvc第一个程序案例 (2)配置web.xml day63_SpringMVC_01 characterEcoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 characterEcoding /* springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml springmvc *.do
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信