spring mvc功能:
以Controller为中心完成对系统流程的控制管理
从请求中搜集数据 对传入的参数进行验证 将结果返回给视图 针对不同的视图提供不同的解决方案 针对jsp视图技术提供标签库 拦截器 上传文件spring-mvc结构 1.DispatcherServlet:(需要自己配置) 中央控制器,把请求给转发到具体的控制类 2.Controller:(需要自己创建) 具体处理请求的控制器 3.handlerMapping:(需要自己配置) 映射处理器,负责映射中央处理器转发给controller时的映射策略 4.ModelAndView:(需要自己创建) 服务层返回的数据和视图层的封装类 5.ViewResolver & View:(需要自己配置) 视图解析器,解析具体的视图 6.Interceptors :(需要自己创建) 拦截器,负责拦截我们定义的请求然后做处理工作 具体执行流程图参见 url(spring-mvc流程图.png)SpringMVC相关类库(导包) com.springsource.javax.servlet.jsp.jstl-1.1.2.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.apache.taglibs.standard-1.1.2.jar org.springframework.aop-3.0.0.RELEASE.jar org.springframework.asm-3.0.0.RELEASE.jar org.springframework.beans-3.0.0.RELEASE.jar org.springframework.context.support-3.0.0.RELEASE.jar org.springframework.context-3.0.0.RELEASE.jar org.springframework.core-3.0.0.RELEASE.jar org.springframework.expression-3.0.0.RELEASE.jar org.springframework.web.servlet-3.0.0.RELEASE.jar org.springframework.web-3.0.0.RELEASE.jar配置 web.xml 在web-app标签内配置: <!-- 中央转发(控制)器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 不要配置/*,否则404,但是可以配置 / --> <url-pattern>*.do</url-pattern> </servlet-mapping> 创建springmvc的核心配置文件(springmvc-servlet.xml) (非注解模式未详细说明) 文件的命名规则:中央控制器(servlet的名称)的名称+“-servlet.xml” 默认位置:WEB-INF下 配置:controller和视图解析器 controller控制器 也可以直接在配置文件中配置(但此方式不常使用,不再介绍,通常都使用注解开发,直接开启注解即可) <!-- 指定使用注解的包,该包及其以下的所有内容均会被扫描 --> <context:component-scan base-package="com.rl.controller"/> <!-- mvc注解的驱动但是如果context:component-scan存在mvc:annotation就没有必要配 --> <!-- <mvc:annotation-driven/> -->视图解析器: <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 文件的后缀名 --> <property name="suffix" value=".jsp"></property> </bean>controller controller的配置 @controller:标识当前类是控制层的一个具体的实现 @requestMapping:放在方法上面用来指定某个方法的路径,当它放在类上的时候相当于命名空间需要组合方法上的requestmapping来访问 该内容可以指定,但是默认为value的值,通常value的值与方法名称保持一致 返回字符串的含义,指的是ModelAndView中viewName,也就是要跳转的页面数据交互 (本处解释不详细,可直接参见代码 url(Myeclipse源码:springmvc_2)) 在方法中可以自己随意去定义方法的参数,如果方法的参数的名称与传入参数的name匹配就会自动接收,并且转换我们所定义的数据类型。 如果参数列表里定义了自定义的类springmvc会给我们把匹配的参数组合起来并且组装成对象。 requestMapping里面的method的类型必须要与前台form的类型一致 @RequestMapping 中可以定义请求方式,如果指定某种请求方式那就必须要以这种请求方式来访问 要配置别的属性时,value就不能省略了 通过request直接获取传递过来的参数 零散的接受单个数据:在参数列表中直接定义要接收的参数和参数的类型 Date数据的传递时需要,绑定时间类型的属性编辑器,然后可以自定义时间的格式 接收多选框中的数据 通过request直接获取传递过来的参数 直接在参数列表中定义数组 实体类的接收: 在参数列表中直接定义要接收的实体类,请求中传递的参数名要和实体类中的set方法后的字符串匹配,否则无法注入 只要有请求到达就会按着参数列表中的实体类来创建对象 因为所有的参数的接收都是在参数列表中,并不是成员变量,每次请求,传递的参数都是一个新的实例,不会产生并发问题 往页面回写数据 设置方法返回值类型是ModelAndView 返回值类型是String,在参数列表中直接来定义一个Map,这个map不是用来接收参数的,而是用来把参数写到页面上去的 返回值类型是String代表viewName,参数列表使用Model用来把数据写到页面上(此方法较为常用,建议使用此方法) 通过ajax访问springmvc (toAjax.jsp),引入jquery,添加 $(function(){ $("#mybutton").click(function(){ var mytext = $("#mytext").val(); $.ajax({ url:"test/ajax1.do", type:"post", data:{ name:mytext }, success:function(responseText){ alert(responseText); }, error:function(){ alert("system error"); } }); }); }); 在控制器中,通过ajax访问springmvc,返回值的类型为void,有两种方式 使用HttpServletResponse往页面写数据 在参数列表中直接定义PrintWriter为我们往页面上写数据 重定向: 直接在返回值中添加"redirect:",如果"redirect:"后面不加"/"代表在当前的controller里面来执行方法,如果加上"/"代表退到根目录下去访问方法""文件上传 引入jar包 com.springsource.org.apache.commons.fileupload-1.2.0.jar com.springsource.org.apache.commons.io-1.4.0.jar 配置相应的视图解析器(springmvc-servlet.xml) <!-- 上传文件复杂表单中文件解析视图 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 以字节为单位 --> <property name="maxUploadSize" value="1024000"></property> </bean> form表单(fileform.jsp): <form action="upload/upload.do" method="post" enctype="multipart/form-data"> 头像:<input type="file" name="pic"> <input type="submit" value="提交"><br> </form> enctype="multipart/form-data"用于POST方式的文件上传,这个属性管理的是表单的MIME编码。 文件上传中的controller的配置(TestUploadController.java) @RequestMapping("/upload.do") public String upload(HttpServletRequest request) throws Exception{ //强制转换request MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request; //获得到文件 CommonsMultipartFile cmf = (CommonsMultipartFile) mr.getFile("pic"); //获得文件的字节数组 byte[] fbyte = cmf.getBytes(); String fileName = ""; //设置时间戳格式 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS"); //获得时间戳的字符串 fileName = format.format(new Date()); //加三位随机数 Random random = new Random(); for(int i = 0; i < 3; i++){ fileName = fileName + random.nextInt(10); } //获得原始文件名 String oriFileName = cmf.getOriginalFilename(); //获得文件的后缀名 String suffix = oriFileName.substring(oriFileName.lastIndexOf(".")); //获得发布后的根路径 String realPath = request.getSession().getServletContext().getRealPath("/"); OutputStream out = new FileOutputStream(new File(realPath+"/upload/"+fileName+suffix)); out.write(fbyte); out.flush(); out.close(); return "success"; } @RequestMapping("/toFileForm.do") public String toFileForm(){ return "fileform"; }拦截器 最终拦截 后置拦截 前置拦截