這篇文章主要介紹了史上最全最強(qiáng)SPRingMVC詳細(xì)示例實(shí)戰(zhàn)教程(圖文),需要的朋友可以參考下
一、SpringMVC基礎(chǔ)入門(mén),創(chuàng)建一個(gè)HelloWorld程序
1.首先,導(dǎo)入SpringMVC需要的jar包。
2.添加Web.xml配置文件中關(guān)于SpringMVC的配置
?123456789101112131415 | <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> < 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-servlet.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 > |
3.在src下添加springmvc-servlet.xml配置文件
?123456789101112131415161718192021222324252627 | <? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xmlns:mvc = "http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- scan the package and the sub package --> < context:component-scan base-package = "test.SpringMVC" /> <!-- don't handle the static resource --> < mvc:default-servlet-handler /> <!-- if you use annotation you must configure following setting --> < mvc:annotation-driven /> <!-- configure the InternalResourceViewResolver --> < bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" id = "internalResourceViewResolver" > <!-- 前綴 --> < property name = "prefix" value = "/WEB-INF/jsp/" /> <!-- 后綴 --> < property name = "suffix" value = ".jsp" /> </ bean > </ beans > |
4.在WEB-INF文件夾下創(chuàng)建名為jsp的文件夾,用來(lái)存放jsp視圖。創(chuàng)建一個(gè)hello.jsp,在body中添加“Hello World”。
5.建立包及Controller,如下所示
6.編寫(xiě)Controller代碼
?123456789 | @Controller @RequestMapping ( "/mvc" ) public class mvcController { @RequestMapping ( "/hello" ) public String hello(){ return "hello" ; } } |
7.啟動(dòng)服務(wù)器,鍵入 http://localhost:8080/項(xiàng)目名/mvc/hello
1.Dispatcherservlet
DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請(qǐng)求,Servlet攔截匹配規(guī)則要自已定義,把攔截下來(lái)的請(qǐng)求,依據(jù)相應(yīng)的規(guī)則分發(fā)到目標(biāo)Controller來(lái)處理,是配置spring MVC的第一步。
2.InternalResourceViewResolver
視圖名稱解析器
3.以上出現(xiàn)的注解
@Controller 負(fù)責(zé)注冊(cè)一個(gè)bean 到spring 上下文中
@RequestMapping 注解為控制器指定可以處理哪些 URL 請(qǐng)求
@Controller
負(fù)責(zé)注冊(cè)一個(gè)bean 到spring 上下文中
@RequestMapping
注解為控制器指定可以處理哪些 URL 請(qǐng)求
@RequestBody
該注解用于讀取Request請(qǐng)求的body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對(duì)象上 ,再把HttpMessageConverter返回的對(duì)象數(shù)據(jù)綁定到 controller中方法的參數(shù)上
@ResponseBody
該注解用于將Controller的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫(xiě)入到Response對(duì)象的body數(shù)據(jù)區(qū)
@ModelAttribute
在方法定義上使用 @ModelAttribute 注解:Spring MVC 在調(diào)用目標(biāo)處理方法前,會(huì)先逐個(gè)調(diào)用在方法級(jí)上標(biāo)注了@ModelAttribute 的方法
在方法的入?yún)⑶笆褂?@ModelAttribute 注解:可以從隱含對(duì)象中獲取隱含的模型數(shù)據(jù)中獲取對(duì)象,再將請(qǐng)求參數(shù) –綁定到對(duì)象中,再傳入入?yún)⒎椒ㄈ雲(yún)?duì)象添加到模型中
@RequestParam
在處理方法入?yún)⑻幨褂?@RequestParam 可以把請(qǐng)求參 數(shù)傳遞給請(qǐng)求方法
@PathVariable
綁定 URL 占位符到入?yún)?/p>
@ExceptionHandler
注解到方法上,出現(xiàn)異常時(shí)會(huì)執(zhí)行該方法
@ControllerAdvice
使一個(gè)Contoller成為全局的異常處理類,類中用@ExceptionHandler方法注解的方法可以處理所有Controller發(fā)生的異常
123456 | //match automatically @RequestMapping ( "/person" ) public String toPerson(String name, double age){ System.out.println(name+ " " +age); return "hello" ; } |
1.編寫(xiě)一個(gè)Person實(shí)體類
?12345678910111213141516171819 | package test.SpringMVC.model; public class Person { public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } private String name; private int age; } |
2.在Controller里編寫(xiě)方法
?123456 | //boxing automatically @RequestMapping ( "/person1" ) public String toPerson(Person p){ System.out.println(p.getName()+ " " +p.getAge()); return "hello" ; } |
12345678910111213 | //the parameter was converted in initBinder @RequestMapping ( "/date" ) public String date(Date date){ System.out.println(date); return "hello" ; } //At the time of initialization,convert the type "String" to type "date" @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date. class , new CustomDateEditor( new SimpleDateFormat( "yyyy-MM-dd" ), true )); } |
123456789 | //pass the parameters to front-end @RequestMapping ( "/show" ) public String showPerson(Map<String,Object> map){ Person p = new Person(); map.put( "p" , p); p.setAge( 20 ); p.setName( "jayjay" ); return "show" ; } |
前臺(tái)可在Request域中取到"p"
123456789 | //pass the parameters to front-end using ajax @RequestMapping ( "/getPerson" ) public void getPerson(String name,PrintWriter pw){ pw.write( "hello," +name); } @RequestMapping ( "/name" ) public String sayHello(){ return "name" ; } |
前臺(tái)用下面的Jquery代碼調(diào)用
?1234567 | $( function (){ $( "#btn" ).click( function (){ $.post( "mvc/getPerson" ,{name:$( "#name" ).val()}, function (data){ alert(data); }); }); }); |
12345 | //redirect @RequestMapping ( "/redirect" ) public String redirect(){ return "redirect:hello" ; } |
1.需要導(dǎo)入兩個(gè)jar包
2.在SpringMVC配置文件中加入
?1234 | <!-- upload settings --> < bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > < property name = "maxUploadSize" value = "102400000" ></ property > </ bean > |
3.方法代碼
?1234567891011121314 | @RequestMapping (value= "/upload" ,method=RequestMethod.POST) public String upload(HttpServletRequest req) throws Exception{ MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req; MultipartFile file = mreq.getFile( "file" ); String fileName = file.getOriginalFilename(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyyMMddHHmmss" ); FileOutputStream fos = new FileOutputStream(req.getsession().getServletContext().getRealPath( "/" )+ "upload/" +sdf.format( new Date())+fileName.substring(fileName.lastIndexOf( '.' ))); fos.write(file.getBytes()); fos.flush(); fos.close(); return "hello" ; } |
4.前臺(tái)form表單
?1234 | < form action = "mvc/upload" method = "post" enctype = "multipart/form-data" > < input type = "file" name = "file" >< br > < input type = "submit" value = "submit" > </ form > |
12345678910 | @Controller @RequestMapping ( "/test" ) public class mvcController1 { @RequestMapping (value= "/param" ) public String testRequestParam( @RequestParam (value= "id" ) Integer id, @RequestParam (value= "name" )String name){ System.out.println(id+ " " +name); return "/hello" ; } } |
1.RestController
?12345678910111213141516171819202122232425262728 | @Controller @RequestMapping ( "/rest" ) public class RestController { @RequestMapping (value= "/user/{id}" ,method=RequestMethod.GET) public String get( @PathVariable ( "id" ) Integer id){ System.out.println( "get" +id); return "/hello" ; } @RequestMapping (value= "/user/{id}" ,method=RequestMethod.POST) public String post( @PathVariable ( "id" ) Integer id){ System.out.println( "post" +id); return "/hello" ; } @RequestMapping (value= "/user/{id}" ,method=RequestMethod.PUT) public String put( @PathVariable ( "id" ) Integer id){ System.out.println( "put" +id); return "/hello" ; } @RequestMapping (value= "/user/{id}" ,method=RequestMethod.DELETE) public String delete( @PathVariable ( "id" ) Integer id){ System.out.println( "delete" +id); return "/hello" ; } } |
2.form表單發(fā)送put和delete請(qǐng)求
在web.xml中配置
?123456789 | <!-- configure the HiddenHttpMethodFilter,convert the post method to put or delete --> < filter > < filter-name >HiddenHttpMethodFilter</ filter-name > < filter-class >org.springframework.web.filter.HiddenHttpMethodFilter</ filter-class > </ filter > < filter-mapping > < filter-name >HiddenHttpMethodFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
在前臺(tái)可以用以下代碼產(chǎn)生請(qǐng)求
?1234567891011121314151617 | < form action = "rest/user/1" method = "post" > < input type = "hidden" name = "_method" value = "PUT" > < input type = "submit" value = "put" > </ form > < form action = "rest/user/1" method = "post" > < input type = "submit" value = "post" > </ form > < form action = "rest/user/1" method = "get" > < input type = "submit" value = "get" > </ form > < form action = "rest/user/1" method = "post" > < input type = "hidden" name = "_method" value = "DELETE" > < input type = "submit" value = "delete" > </ form > |
1.導(dǎo)入以下jar包
2.方法代碼
?1234567891011121314 | @Controller @RequestMapping ( "/json" ) public class jsonController { @ResponseBody @RequestMapping ( "/user" ) public User get(){ User u = new User(); u.setId( 1 ); u.setName( "jayjay" ); u.setBirth( new Date()); return u; } } |
1.處理局部異常(Controller內(nèi))
?12345678910111213 | @ExceptionHandler public ModelAndView exceptionHandler(Exception ex){ ModelAndView mv = new ModelAndView( "error" ); mv.addObject( "exception" , ex); System.out.println( "in testExceptionHandler" ); return mv; } @RequestMapping ( "/error" ) public String error(){ int i = 5 / 0 ; return "hello" ; } |
2.處理全局異常(所有Controller)
?12345678910 | @ControllerAdvice public class testControllerAdvice { @ExceptionHandler public ModelAndView exceptionHandler(Exception ex){ ModelAndView mv = new ModelAndView( "error" ); mv.addObject( "exception" , ex); System.out.println( "in testControllerAdvice" ); return mv; } } |
3.另一種處理全局異常的方法
在SpringMVC配置文件中配置
?12345678 | <!-- configure SimpleMappingExceptionResolver --> < bean class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" > < property name = "exceptionMappings" > < props > < prop key = "java.lang.ArithmeticException" >error</ prop > </ props > </ property > </ bean > |
error是出錯(cuò)頁(yè)面
1.創(chuàng)建一個(gè)MyInterceptor類,并實(shí)現(xiàn)HandlerInterceptor接口
?1234567891011121314151617181920212223 | public class MyInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println( "afterCompletion" ); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println( "postHandle" ); } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println( "preHandle" ); return true ; } } |
2.在SpringMVC的配置文件中配置
?1234567 | <!-- interceptor setting --> < mvc:interceptors > < mvc:interceptor > < mvc:mapping path = "/mvc/**" /> < bean class = "test.SpringMVC.Interceptor.MyInterceptor" ></ bean >gt; </ mvc:interceptor > </ mvc:interceptors > |
3.攔截器執(zhí)行順序
1.導(dǎo)入Hibernate-validate需要的jar包
(未選中不用導(dǎo)入)
2.編寫(xiě)實(shí)體類User并加上驗(yàn)證注解
?12345678910111213141516171819202122232425262728293031 | public class User { public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this .birth = birth; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]" ; } private int id; @NotEmpty private String name; @Past @DateTimeFormat (pattern= "yyyy-MM-dd" ) private Date birth; } |
ps:@Past表示時(shí)間必須是一個(gè)過(guò)去值
3.在jsp中使用SpringMVC的form表單
?123456 | < form:form action = "form/add" method = "post" modelAttribute = "user" > id:< form:input path = "id" />< form:errors path = "id" />< br > name:< form:input path = "name" />< form:errors path = "name" />< br > birth:< form:input path = "birth" />< form:errors path = "birth" /> < input type = "submit" value = "submit" > </ form:form > |
ps:path對(duì)應(yīng)name
4.Controller中代碼
?1234567891011121314151617 | @Controller @RequestMapping ( "/form" ) public class formController { @RequestMapping (value= "/add" ,method=RequestMethod.POST) public String add( @Valid User u,BindingResult br){ if (br.getErrorCount()> 0 ){ return "addUser" ; } return "showUser" ; } @RequestMapping (value= "/add" ,method=RequestMethod.GET) public String add(Map<String,Object> map){ map.put( "user" , new User()); return "addUser" ; } } |
ps:
1.因?yàn)閖sp中使用了modelAttribute屬性,所以必須在request域中有一個(gè)"user".
2.@Valid 表示按照在實(shí)體上標(biāo)記的注解驗(yàn)證參數(shù)
3.返回到原頁(yè)面錯(cuò)誤信息回回顯,表單也會(huì)回顯
5.錯(cuò)誤信息自定義
在src目錄下添加locale.properties
NotEmpty.user.name=name can't not be emptyPast.user.birth=birth should be a past valueDateTimeFormat.user.birth=the format of input is wrongtypeMismatch.user.birth=the format of input is wrongtypeMismatch.user.id=the format of input is wrong在SpringMVC配置文件中配置
?
1234 | <!-- configure the locale resource --> < bean id = "messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource" > < property name = "basename" value = "locale" ></ property > </ bean > |
6.國(guó)際化顯示
在src下添加locale_zh_CN.properties
username=賬號(hào)passWord=密碼locale.properties中添加
username=user namepassword=password創(chuàng)建一個(gè)locale.jsp
?
1234 | < body > < fmt:message key = "username" ></ fmt:message > < fmt:message key = "password" ></ fmt:message > </ body > |
在SpringMVC中配置
?12 | <!-- make the jsp page can be visited --> < mvc:view-controller path = "/locale" view-name = "locale" /> |
讓locale.jsp在WEB-INF下也能直接訪問(wèn)
最后,訪問(wèn)locale.jsp,切換瀏覽器語(yǔ)言,能看到賬號(hào)和密碼的語(yǔ)言也切換了
1.創(chuàng)建一個(gè)test.SpringMVC.integrate的包用來(lái)演示整合,并創(chuàng)建各類
2.User實(shí)體類
?12345678910111213141516171819202122232425262728293031 | public class User { public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this .birth = birth; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]" ; } private int id; @NotEmpty private String name; @Past @DateTimeFormat (pattern= "yyyy-MM-dd" ) private Date birth; } |
3.UserService類
?12345678910 | @Component public class UserService { public UserService(){ System.out.println( "UserService Constructor.../n/n/n/n/n/n" ); } public void save(){ System.out.println( "save" ); } } |
4.UserController
?12345678910111213 | @Controller @RequestMapping ( "/integrate" ) public class UserController { @Autowired private UserService userService; @RequestMapping ( "/user" ) public String saveUser( @RequestBody @ModelAttribute User u){ System.out.println(u); userService.save(); return "hello" ; } } |
5.Spring配置文件
在src目錄下創(chuàng)建SpringIOC的配置文件applicationContext.xml
?12345678910111213141516171819202122 | <? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd " xmlns:util = "http://www.springframework.org/schema/util" xmlns:p = "http://www.springframework.org/schema/p" xmlns:context = "http://www.springframework.org/schema/context" > < context:component-scan base-package = "test.SpringMVC.integrate" > < context:exclude-filter type = "annotation" expression = "org.springframework.stereotype.Controller" /> < context:exclude-filter type = "annotation" expression = "org.springframework.web.bind.annotation.ControllerAdvice" /> </ context:component-scan > </ beans > |
在Web.xml中添加配置
?12345678 | <!-- configure the springIOC --> < listener > < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > </ listener > < context-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:applicationContext.xml</ param-value > </ context-param > |
6.在SpringMVC中進(jìn)行一些配置,防止SpringMVC和SpringIOC對(duì)同一個(gè)對(duì)象的管理重合
?1234567 | <!-- scan the package and the sub package --> < context:component-scan base-package = "test.SpringMVC.integrate" > < context:include-filter type = "annotation" expression = "org.springframework.stereotype.Controller" /> < context:include-filter type = "annotation" expression = "org.springframework.web.bind.annotation.ControllerAdvice" /> </ context:component-scan > |
1、springmvc基于方法開(kāi)發(fā)的,struts2基于類開(kāi)發(fā)的。springmvc將url和controller里的方法映射。映射成功后springmvc生成一個(gè)Handler對(duì)象,對(duì)象中只包括了一個(gè)method。方法執(zhí)行結(jié)束,形參數(shù)據(jù)銷毀。springmvc的controller開(kāi)發(fā)類似web service開(kāi)發(fā)。
2、springmvc可以進(jìn)行單例開(kāi)發(fā),并且建議使用單例開(kāi)發(fā),struts2通過(guò)類的成員變量接收參數(shù),無(wú)法使用單例,只能使用多例。
3、經(jīng)過(guò)實(shí)際測(cè)試,struts2速度慢,在于使用struts標(biāo)簽,如果使用struts建議使用jstl。
http://www.jb51.net/article/99010.htm
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注