Spring MVC--入门

来源:互联网 发布:javascript在线格式化 编辑:程序博客网 时间:2024/06/06 04:03

spring-mvc结构

1.   DispatcherServlet:中央控制器,把请求给转发到具体的控制类

1.          Controller:具体处理请求的控制器

2.          handlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略

3.          ModelAndView:服务层返回的数据和视图层的封装类

4.          ViewResolver  & View:视图解析器,解析具体的视图

5.          Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作

spring-mvc流程

springMVC依赖的包

org.springframework.aop-3.0.3.RELEASE.jar

spring的aop面向切面编程

org.springframework.asm-3.0.3.RELEASE.jar

spring独立的asm字节码生成程序

org.springframework.beans-3.0.3.RELEASE.jar

IOC的基础实现

org.springframework.context-3.0.3.RELEASE.jar

IOC基础上的扩展服务

org.springframework.core-3.0.3.RELEASE.jar

spring的核心包

org.springframework.expression-3.0.3.RELEASE.jar

spring的表达式语言

org.springframework.web-3.0.3.RELEASE.jar

web工具包

org.springframework.web.servlet-3.0.3.RELEASE.jar

mvc工具包

springmvc的配置文件

  配置中央控制器

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><!-- 中央控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><!-- struts习惯使用/*,在springmvc不管用 --><url-pattern>*.do</url-pattern></servlet-mapping></web-app>

springmvc的核心配置文件

文件的命名规则:中央控制器(servlet的名称)的名称+“-servlet.xml”

默认位置:WEB-INF下

配置:controller和视图解析器


创建controller

三种handlerMapping

1.BeanNameUrlHandlerMapping  (默认)

<!-- 按着controllername来映射寻找controller,默认存在 -->             

   <beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

2.SimpleUrlHandlerMapping

<!-- 使用简单url来映射 -->

   <beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

      <propertyname="mappings">

        <props>

           <propkey="/hello1.do">myController</prop>

        </props>

      </property>

   </bean>

3.ControllerClassNameHandlerMapping

<!-- 控制类的类名控制器,访问时类名首字母需要小写 -->

   <beanclass="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>

springmvc基于注解的开发

创建web项目springmvc的配置文件中指定注解驱动,配置扫描器

<!-- mvc的注解驱动 --><mvc:annotation-driven/><!-- 一旦有扫描器的定义mvc:annotation-driven不需要,扫描器已经有了注解驱动的功能 --><context:component-scan base-package="cn.itcast.springmvc"/><!-- 前缀+ viewName +后缀 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- webroot到某一指定的文件夹的路径 --><property name="prefix" value="/WEB-INF/jsp/"></property><!-- 视图名称的后缀 --><property name="suffix" value=".jsp"></property></bean>

注解方式参数以及例子

import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Random;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.propertyeditors.CustomDateEditor;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.ServletRequestDataBinder;import org.springframework.web.bind.annotation.InitBinder;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.multipart.MultipartHttpServletRequest;import org.springframework.web.multipart.commons.CommonsMultipartFile;import org.springframework.web.servlet.ModelAndView;import cn.itcast.springmvc.model.Person;import cn.itcast.springmvc.model.User;@Controller// 用来标注当前类是springmvc的控制层的类@RequestMapping("/test")// controller的唯一标识或者命名空间public class TestController {/** * @return */@RequestMapping("/hello.do")// 用来访问控制层的方法的注释public String hello() {return "jsp1/index";}@RequestMapping("/toPerson.do")public String toPerson(HttpServletRequest request) {String result = request.getParameter("name");System.out.println(result);return "jsp1/index";}/** * 在参数列表上直接定义要接收的参数名称,只要参数名称能匹配的上就能接收所传送过来的数据, * 可以自动转换参数列表里面的类型,注意的是:值与类型之间可以转化的 *  * @param name * @return */@RequestMapping("/toPerson1.do")public String toPerson1(String name, Integer age, String address,Date birthday) {System.out.println("name:" + name + "," + "age:" + age + ","+ "address:" + address + "birthday:" + birthday);return "jsp1/index";}/** * 注册时间类型的属性编辑器 *  * @param binder */@InitBinderpublic void initBinder(ServletRequestDataBinder binder) {binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}/** * 传递的参数的名字必须要与实体类的属性set方法后面的字符串上才能接受到参数,首字符的大小写不区分 * 请求中传的参数只要是和参数列表里面的变量名或者实体里面的set后面的字符串匹配的上就能接收到 *  * @param person * @return */@RequestMapping("/toPerson2.do")public String toPerson2(Person person, User user) {System.out.println(person);System.out.println(user);return "jsp1/index";}@RequestMapping("/toPerson3.do")public String toPerson3(String[] name) {for (String str : name) {System.out.println(str);}return "jsp1/index";}/** * 方法的返回值采用ModelAndView,new ModelAndView("index",map) ,相当于把结果数据放到request里面 *  * @param name * @return * @throws Exception */@RequestMapping("/toPerson4.do")public ModelAndView toPerson4(String[] name) throws Exception {Person person = new Person();person.setName("Sunny");person.setAge(28);SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");person.setAddress("Beijing");Date date = format.parse("2012-12-12");person.setBirthday(date);Map<String, Object> map = new HashMap<String, Object>();map.put("p", person);return new ModelAndView("index", map);}/** * 直接在方法的参数列表中来定义Map,这个Map即使ModelAndView里面的Map, * 由视图解析器统一处理,统一走ModelAndView的接口 *  * @param map * @return * @throws Exception */@RequestMapping("/toPerson5.do")public String toPerson5(Map<String, Object> map) throws Exception {Person person = new Person();person.setName("Sunny");person.setAge(28);SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");person.setAddress("广州");Date date = format.parse("2012-12-12");person.setBirthday(date);map.put("p", person);return "index";}/** * @param map * @return * @throws Exception */@RequestMapping("/toPerson6.do")public String toPerson6(Model model) throws Exception {Person person = new Person();person.setName("Sunny");person.setAge(28);SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");person.setAddress("广州");Date date = format.parse("2012-12-12");person.setBirthday(date);// 把参数放到request类里面去model.addAttribute("p", person);return "index";}@RequestMapping(value = "/toPerson7.do", method = RequestMethod.POST)public String toPerson7(Person person) {System.out.println(person);return "jsp1/index";}@RequestMapping("/toForm.do")public String toForm() {return "form";}@RequestMapping("/toAjax.do")public String toAjax() {return "ajax";}@RequestMapping("/rediectToForm.do")public String rediectToForm() {return "redirect:toForm.do";}/** * controller之间的重定向:必须要指定好controller的命名空间再指定requestMapping的值: * 后必须加"/" 是从根目录开始找 *  * @return */@RequestMapping("/rediectToForm1.do")public String rediectToForm1() {return "redirect:/test1/toForm.do";}/** * ajax的请求返回值类型应该是void,参数列表里直接定义HttpServletResponse, * 获得PrintWrite的类,最后可把结果写到页面 不建议试用 *  * @return */@RequestMapping("/ajax.do")public void ajax(String name, HttpServletResponse response)throws Exception {String result = "hello" + name;response.getWriter().write(result);}/** * 直接在参数列表上定义PrintWriter,out.write(result);把结果写到页面,建议使用 *  * @param name * @param out * @throws Exception */@RequestMapping("/ajax1.do")public void ajax1(String name, PrintWriter out) throws Exception {String result = "hello" + name;out.write(result);}}

文件上传

引入jar包


 配置视图解析器

<!-- id="multipartResolver"必须是multipartResolver --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- maxUploadSize:文件上传的最大值以byte为单位 --><property name="maxUploadSize" value="1024000"></property></bean>

文件上传的例子

@SuppressWarnings("resource")@RequestMapping(value = "/toPerson8.do", method = RequestMethod.POST)public String toPerson8(Person person,HttpServletRequest request) throws Exception {//第一步转化requestMultipartHttpServletRequest rm=(MultipartHttpServletRequest) request;//获得文件CommonsMultipartFile cfile=(CommonsMultipartFile) rm.getFile("pic");//获得文件的字节数组byte[] bfile=cfile.getBytes();String fileName="";//获得当前时间的最小精度SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmSSS");fileName=format.format(new Date());//获得三位随机数Random random=new Random();for(int i=0;i<3;i++){fileName=fileName+random.nextInt(9);}//获得原始文件名String origFileName=cfile.getOriginalFilename();String suffix=origFileName.substring(origFileName.lastIndexOf("."));//定义文件的输出流String path=request.getSession().getServletContext().getRealPath("/");OutputStream out=new FileOutputStream(new File(path+"/upload/"+fileName+suffix));out.write(bfile);out.flush();out.close();return "jsp1/index";}


拦截器

拦截示意图:

拦截器的配置文件的配置

<mvc:interceptors><mvc:interceptor><!-- 某一模块的拦截:/myPath/**, 拦截所有的请求/**--><mvc:mapping path="/**"/><bean class="cn.itcast.springmvc.interceptor.MyIntercepor"></bean></mvc:interceptor></mvc:interceptors>

代码示例:

import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class MyIntercepor implements HandlerInterceptor {/*  *执行时机:视图已经解析完毕,类似try catch后的finally */@Overridepublic void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception ex)throws Exception {System.out.println("afterCompletion...");}/*  *执行时机:在controller执行完,视图解释器没有把视图解析成页面, * 对视图做统一的修改,主要体现在Model上 */@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView mv) throws Exception {System.out.println("postHander...");Map<String , Object> map=mv.getModel();map.put("test", "append something");}/*  *执行时机:在执行controller之前来执行 * 返回值类型:boolean:true 代表放行就可以访问controller,false不可以访问controller */@Overridepublic boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws Exception {System.out.println("preHander...");return true;}}


相关的资源文件地址:


0 0
原创粉丝点击