Spring MVC教程_第1页
Spring MVC教程_第2页
Spring MVC教程_第3页
Spring MVC教程_第4页
Spring MVC教程_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 开发一个springMVC步骤1. 需要的jar包(在原来基础上要加的)2. 添加配置文件springMVC.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="/2001/XMLSchema-instance" xmlns="/schema/beans"xmlns:context="http:/www.springframew

2、/schema/context"xmlns:util="/schema/util"xmlns:mvct="/schema/mvc"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsdhttp:/www.springfra

3、/schema/context/schema/context/spring-context.xsd/schema/util/schema/util/spring-util.xsd/schema/mvc/schema/mvc/spring-mvc.xsd"></bean

4、s>3. 在web.xml配置DispacherServlet启动springMVC<servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!- spring的配置文

5、件 -> <param-value>classpath:springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>4.

6、写一个自己定制的controllerimport org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class FirstController implements Controller public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception System.out.println(&quo

7、t;-FirstController");ModelAndView mv=new ModelAndView("/WEB-INF/views/first.jsp");/转到这个页面return mv;5. 在springMVC.xml文件配置controller<bean name="/first" class="controller.FirstController"></bean></beans>6. 输入网址为http:/localhost:8080/SpringMVCspringMVC

8、为工程名,会交给中央处理器DispacherServlet,在web.xml找到classpath下的文件,如springMVC.xml。输入http:/localhost:8080/SpringMVC/first,会在springMVC下找到name为/first的bean,这个bean的class属性,那个类就是处理请求的。二、 一个controller写多个方法1. 继承MultiActionController继承之后,可以写多个返回值是ModelAndView的方法,第一个参数是HttpServletRequest,第二个参数是HttpServletResponse。public c

9、lass StudentController extends MultiActionController public ModelAndView add(HttpServletRequest request,HttpServletResponse response)System.out.println("->add");ModelAndView mv=new ModelAndView("/WEB-INF/views/ControllerTest.jsp");return mv;public ModelAndView edit(HttpServlet

10、Request request,HttpServletResponse response)System.out.println("->edit");ModelAndView mv=new ModelAndView("/WEB-INF/views/ControllerTest.jsp");return mv;2. 配置springMVC.xml配置文件添加bean配置方法参数的处理器<!- id可以随意改变,class不能改 -> <bean id="methodNameResolver" class="

11、;org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"><!name不能修改,value可以修改 -> <property name="paramName" value="action"></property> <!- name不能改,value可以改,value为,打开controller时候默认调用的方法名 -> <property name="defaultMethodN

12、ame" value="view"></property> </bean> 在自己写的MultiActionController中引用方法参数处理器 <bean name="/student" class="controller.StudentController"> <!- name不能改,ref要和上面的id一样 -> <property name="methodNameResolver" ref="methodNameResolv

13、er"></property> </bean>输入http:/localhost:8080/SpringMVC/student,会打开defaultMethodName对应value的方法,如果要打开StudentController控制器里面的add方法,可以输入http:/localhost:8080/SpringMVC/student?action=add 这个action对应methodNameResolver的paramName的值。三、 配置视图处理器视图处理器,可以在编程的时候,跳转页面时,不用写前缀,如/WEB-INF/views,和后缀

14、,如.jsp。<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><!- 前缀 -> <property name="suffix" value=".jsp">

15、;</property><!- 后缀 -> </bean>这样的话ModelAndView mv=new ModelAndView("ControllerTest");四、 给页面传递信息用addObject(String,Object)方法,也可以用request.setAttribute()方法public ModelAndView test(HttpServletRequest request,HttpServletResponse response)System.out.println("->test")

16、;ModelAndView mv=new ModelAndView("TestModelView");/和request.setAttribute()传的参数一样mv.addObject("username", "tomcat");mv.addObject("interest", new String"篮球","足球");return mv;五、 使用注解1. 在springMVC.xml添加注解配置信息,声明启用MVC注解<bean class="org.s

17、pringframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean><bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>2. 用Controller和RequestMapping注解controller类,该类不用继承任何类方法返回类型是ModelAndView,可以不用传参数Cont

18、rollerpublic class TestAnnotationController /声明这是一个控制器方法,后面传入的,是一个urlRequestMapping("/annotation/test1")public ModelAndView test1()ModelAndView mv=new ModelAndView("testannotation");return mv;RequestMapping("/annotation/test2")public ModelAndView test2()ModelAndView mv=

19、new ModelAndView("testannotation");return mv;RequestMapping("/annotation/test3")public ModelAndView test3()ModelAndView mv=new ModelAndView("testannotation");return mv;3. 在springMVC.xml添加配置信息<!- 扫描base-package包下的所有类 -><context:component-scan base-package="

20、controller"></context:component-scan>六、 controller接收页面信息1. 使用HttpServletRequest来接收和Servlet处理差不多public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception String username=request.getParameter("username");String password=request.getParam

21、eter("password");System.out.println("username->"+username);System.out.println("password->"+password);ModelAndView mv=new ModelAndView("testparameter");return mv;2. 使用分散的方法RequestMapping(value="/testparameter2/test2")public ModelAndView test2(St

22、ring username,String password)System.out.println("采用分散的方式");System.out.println("username->"+username);System.out.println("password->"+password);ModelAndView mv=new ModelAndView("testparameter");return mv;传入来的参数变量名,必须要与html表单的name一模一样。3. 使用合成的一个对象参数接收Requ

23、estMapping(value="/testparameter2/test3")public ModelAndView test3(User user)System.out.println("采用对象的方式");System.out.println("username->"+user.getUsername();System.out.println("password->"+user.getPassword();ModelAndView mv=new ModelAndView("testpa

24、rameter");return mv;User类的属性名必须与html表单的name一样。4. 中文乱码post解决方法可以写一个过滤器,进行过滤,也可以也可以用spring提供的过滤器在web.xml添加以下配置<filter> <filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param

25、> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>5. 中文乱码get解决方法如果你

26、是更改的tomcat安装目录的server.xml配置文件,那么在用eclipse运行项目时会发现配置没起作用,其实是因为eclipse在运行项目时是用的eclipse中配置的tomcat,打开eclipse中的tomcat配置文件,server.xml在<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>更改为<Connector connectionTimeout=&

27、quot;20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>七、 静态资源访问1. 静态资源:js,css,image开启spring mvc之后,按照平常的方法,导入js,css,image资源,并不能正常运行。因为在配置web.xml时候,配置了DispacherServlet,所以,所有请求都经过DispacherServlet。DispacherServlet把那些请求过滤掉。2.

28、在spring.xml下配置静态资源<!- 静态资源处理 -><mvc:resources mapping="/images/*" location="/images/" ></mvc:resources><mvc:resources location="/js/" mapping="/js/*"></mvc:resources><mvc:resources location="/css/" mapping="/css/

29、*"></mvc:resources>mapping的意思是,请求地址,images下的所有子文件夹(第一个*号)的所有文件(第二个*号),全部映射到物理地址image文件夹下。还有一种方法,就是<mvc:default-servlet-handler/>,可以代替上面三句。八、 PathVariable的使用1. 单参数<a href="<%=request.getContextPath()%>/testpathvariable/detail?id=3">通过参数传递id</a>参数传递,就是?后

30、面加个key=value。还有一种方法,就是用PathVariable注解,可以通过下面方式传递<a href="<%=request.getContextPath()%>/testpathvariable/detail/3">直接在路径上传递id</a>是直接/后面加value。Controllerpublic class TestPathVariableController RequestMapping(value="/testpathvariable")public ModelAndView view()Mode

31、lAndView mv=new ModelAndView("TestPathVariable");return mv;RequestMapping(value="/testpathvariable/detail")public ModelAndView detail(Integer id)System.out.println("->"+id);ModelAndView mv=new ModelAndView("TestPathVariable");return mv;/PathVariable注解的参数,名字

32、一定要和里面的一样RequestMapping注解的value,后面 RequestMapping(value="/testpathvariable/detail/id")public ModelAndView detail2(PathVariable("id") Integer id)System.out.println("-fd->"+id);ModelAndView mv=new ModelAndView("TestPathVariable");return mv;还有一种,请求是伪html的方法Req

33、uestMapping(value="/testpathvariable/detail/id.html")public ModelAndView detail2(PathVariable("id") Integer id)System.out.println("-fd->"+id);ModelAndView mv=new ModelAndView("TestPathVariable");return mv;在后面加自己想加的内容,在请求的时候就可以加自己的内容,<a href="<%=r

34、equest.getContextPath()%>/testpathvariable/detail/3.html">2. 多个参数RequestMapping(value="/testpathvariable/detail/id/name")public ModelAndView detail3(PathVariable("id") Integer id,PathVariable("name") String name)System.out.println("-fd->"+id);Sys

35、tem.out.println("-"+name);ModelAndView mv=new ModelAndView("TestPathVariable");return mv;请求连接为<a href="<%=request.getContextPath()%>/testpathvariable/detail/3/tom">直接在路径上传递id和name</a>九、 注解和Controller代码的优化1. springMVC.XML对注解配置的优化要添加注解,则要在springMVC.XML下添

36、加两句配置<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean><bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>通过优化,可以把以上两句简化为以下一句<mvc:annotation-driven><

37、/mvc:annotation-driven>2. controller代码优化,统一的RequestMapping在注解的时候,后面的url很多都相同,例如/annotation,很多重复,如果要改,全部改,很麻烦RequestMapping(value="/annotation/test1")public ModelAndView test1()System.out.println("test1");ModelAndView mv=new ModelAndView("testannotation");return mv;Re

38、questMapping(value="/annotation/test2")public ModelAndView test2()System.out.println("test2");ModelAndView mv=new ModelAndView("testannotation");return mv;解决方法如下:ControllerRequestMapping("/annotation2")public class TestAnnotationController2 RequestMapping(&quo

39、t;/test1")public ModelAndView test1()System.out.println("test1");ModelAndView mv=new ModelAndView("testannotation");return mv;RequestMapping("/test2")public ModelAndView test2()System.out.println("test2");ModelAndView mv=new ModelAndView("testannotat

40、ion");return mv;3. Model和View的优化RequestMapping("/test3")public String test3(Model model)System.out.println("test3");model.addAttribute("mm", "赫本");/return jsp的名字return "testannotation"十、 使用ResponseBody返回json数据1. 使用原始API HttpServletResponse返回Requ

41、estMapping("/test1")public void test1(HttpServletResponse response) throws IOExceptionresponse.setContentType("application/x-javascript;charset=utf-8");String json=""username":tomcat,"password":123456,"realname":小明"response.getWriter().prin

42、t(json);response.getWriter().flush();2. 使用ResponseBody注解返回字符串jsonRequestMapping("/test2")ResponseBodypublic String test2()String json=""username":tomcat,"password":123456,"realname":小明"return json;3. 使用ResponseBody注解返回对象RequestMapping("/test3&qu

43、ot;)ResponseBodypublic User test3()User u=new User();u.setUsername("tomcat");u.setPassword("123456");u.setRealname("哈哈");return u;4. 使用ResponseBody注解返回ListRequestMapping("/test4")ResponseBodypublic List<User> test4()List<User> users=new ArrayList&l

44、t;User>();for (int i = 0; i < 10; i+) User u=new User();u.setUsername("tomcat"+i);u.setPassword("123456"+i);u.setRealname("哈哈"+i);users.add(u);return users;5. 使用ResponseBody注解返回MapRequestMapping("/test5")ResponseBodypublic Map test5()Map m=new HashMap();

45、m.put("mm", "赫本");m.put("date", new Date();m.put("d", 22.3);List<User> users=new ArrayList<User>();for (int i = 0; i < 10; i+) User u=new User();u.setUsername("tomcat"+i);u.setPassword("123456"+i);u.setRealname("哈哈"

46、+i);users.add(u);m.put("users", users);return m;十一、 springMVC文件上传1. 配置文件上传处理器<!- 配置文件上传处理器 -> <bean id="multipartResolver" class="mons.CommonsMultipartResolver"> <!- 默认编码 -> <property name="defaultEncoding" value="utf-8"></

47、property> <!- 上传文件大小的最大值,单位为B -> <property name="maxUploadSize" value="100242880"></property> <!- 在内存中的最大值,超过最大值,放在临时文件夹 -> <property name="maxInMemorySize" value="40960"></property> </bean>2. 原始IO上传方式Html的代码<h1&

48、gt;演示采用spring提供的api保存</h1><!- 必须要用post的方式,enctype属性一定要填 -><form action="<%=request.getContextPath()%>/testupload/upload2" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="upload"><br/><i

49、nput type="submit" value="上传"></form>Controller代码RequestMapping("/upload1")/传入参数名"upload"已经和html传进来的名字一样,所以注解里面的"upload"可以删除,如果传入参数名不一样,则注解参数名一定要和html传入的一样public String upload1(RequestParam("upload")CommonsMultipartFile upload,Http

50、Session session) throws IOException/获得文件的原始文件名String originalFilename= upload.getOriginalFilename();String extendName=""/获得文件前缀if(originalFilename.lastIndexOf(".")!=-1)extendName=originalFilename. substring(originalFilename.indexOf(".");String newFileName=System.current

51、TimeMillis()+extendName;/新生成的文件名,要唯一,不能有中文System.out.println(originalFilename+"->"+newFileName);String realPath=session.getServletContext().getRealPath("/upload");File saveDir=new File(realPath);if(!saveDir.exists()/如果文件不存在,就要创建出来saveDir.mkdirs();File saveFile=new File(saveDir

52、,newFileName);OutputStream out=new FileOutputStream(saveFile);/构建目标流InputStream in=upload.getInputStream();/得到上传的文件流byte b=new byte1024;int len=-1;while(len=in.read(b)!=-1)out.write(b, 0, len);out.flush();out.close();in.close();return "TestUpload"上传后的文件,放在D:workspace.metadata.pluginsorg.ec

53、lipse.wst.server.coretmp0wtpwebappsprojectnameuploadWorkspace为工作空间文件夹,projectname为工程名上传文件之后,会请求转发,回到TestUpload.jsp,这样刷新页面,就会重复上文文件。所以要请求转发才可以。一个错误的方法就是return "redirect:TestUpload"这样其实是访问/SpringMVC/WEB-INF/views/TestUpload.jsp。这个WEB-INF下的文件是不能直接访问的。所以,要访问view这个controller。return "redire

54、ct:/testupload"3. 采用spring提供的api保存RequestMapping("/upload2")public String upload2(RequestParam("upload")CommonsMultipartFile upload,HttpSession session) throws IllegalStateException, IOExceptionString originalFilename= upload.getOriginalFilename();/获得文件的原始文件名String extendNam

55、e=""if(originalFilename.lastIndexOf(".")!=-1)/获得文件前缀extendName=originalFilename. substring(originalFilename.indexOf(".");String newFileName=System.currentTimeMillis()+extendName;/新生成的文件名,要唯一,不能有中文System.out.println(originalFilename+"->"+newFileName);String

56、realPath=session.getServletContext().getRealPath("/upload");File saveDir=new File(realPath);if(!saveDir.exists()/如果文件不存在,就要创建出来saveDir.mkdirs();File saveFile=new File(saveDir,newFileName);upload.transferTo(saveFile);/将文件转移到目标位置上return "redirect:/testupload"4. 多文件上传<h1>演示多文件

57、上传</h1><form action="<%=request.getContextPath()%>/testupload/upload3" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="upload"><br/>选择文件:<input type="file" name="upload"&g

58、t;<br/>选择文件:<input type="file" name="file"><br/><input type="submit" value="上传"></form>RequestMapping("/upload3")public String upload3(HttpServletRequest request) throws IllegalStateException, IOExceptionString realPath=

59、request.getSession().getServletContext().getRealPath("/upload");File saveDir=new File(realPath);if(!saveDir.exists()/如果文件不存在,就要创建出来saveDir.mkdirs();if(request instanceof MultipartHttpServletRequest)MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;List<Multip

60、artFile> uploads=multiRequest.getFiles("upload");for(MultipartFile mv:uploads)String originalFileName=mv.getOriginalFilename();String extendName=""if(originalFileName.indexOf(".")!=-1)extendName=originalFileName.substring( originalFileName.indexOf(".");Stri

61、ng newFileName=System.currentTimeMillis()+extendName;System.out.println(originalFileName+"->"+newFileName);File saveFile=new File(saveDir,newFileName);mv.transferTo(saveFile);MultipartFile file=multiRequest.getFile("file");String originalFileName=file.getOriginalFilename();Str

62、ing extendName=""if(originalFileName.indexOf(".")!=-1)extendName=originalFileName.substring( originalFileName.indexOf(".");String newFileName=System.currentTimeMillis()+extendName;System.out.println(originalFileName+"->"+newFileName);File saveFile=new File(saveDir,newFileName);file.transferTo(saveFile);return "redirect:/testupload"十二、 服务端数据校验1. 为什么要有服务端数据校验(1) 防止用户禁用JavaScript(2) 防止用户绕过浏览器,比如利用第三方组件HttpClient.jar2. 校验日期表单提交的日期,是字符串形式返回给服务器。而实体类的日期属性;类型是util包下的Date类,所以可能会产生错误,解决方法如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论