javascript
02基于注解开发SpringMVC项目(jar包,异步,request,参数传递,多选的接收,Model传参,map传参,model传参,ajax,重定向,时间日期转换)
1?所需jar包
項目結構如下:
2?web.xml配置文件的內容如下:
| <?xmlversion="1.0"encoding="UTF-8"?> <web-appversion="2.5" ???xmlns="http://java.sun.com/xml/ns/javaee" ???xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ???xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ???http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> ?<servlet> ?? <servlet-name>springmvc</servlet-name> ?? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> ?</servlet> ?<servlet-mapping> ?? <servlet-name>springmvc</servlet-name> ?? <!-- struts用/*,springmvc不能用/*方式,配置的url-pattern如:*.xxx --> ?? <url-pattern>*.do</url-pattern> ?</servlet-mapping> </web-app> |
3?springmvc-servlet.xml的內容如下:
| <?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" ???xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc" ???xmlns:context="http://www.springframework.org/schema/context" ???xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" ???xsi:schemaLocation="http://www.springframework.org/schema/beans ??????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ??????http://www.springframework.org/schema/mvc ??????http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd ??????http://www.springframework.org/schema/context ??????http://www.springframework.org/schema/context/spring-context-3.0.xsd ??????http://www.springframework.org/schema/aop ??????http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ??????http://www.springframework.org/schema/tx ??????http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> ???<context:component-scanbase-package="com.rl.controller"/> ???<bean ?????? class="org.springframework.web.servlet.view.InternalResourceViewResolver"> ??????<propertyname="prefix"value="/WEB-INF/jsp/"/> ??????<propertyname="suffix"value=".jsp"/> ???</bean> ? ???<!--文件上傳的視圖解析器 id一定是multipartResolver,不能隨便定義 --> ???<beanid="multipartResolver" ???class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> ??????<!--文件上傳的最大值,以字節為單位 --> ??????<propertyname="maxUploadSize"value="1024000"></property> ???</bean> ? ???<mvc:interceptors> ??????<mvc:interceptor> ??????????<!-- path:指定要攔截的范圍。語法:/(根目錄)test/**,所有攔截/** --> ??????????<mvc:mappingpath="/**"/> ??????????<beanclass="com.rl.interceptor.MyInterceptor"/> ??????</mvc:interceptor> ???</mvc:interceptors> </beans> |
4?Test1Controller.java的內容如下:
| package com.rl.controller; ? import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; ? @Controller @RequestMapping("/test1") //當前Controller的namespace,防止不同的Controller中方名重復的問題 public class Test1Controller { ???????? ????????/** ?????????* 瀏覽器中的訪問地址是:http://localhost:8080/springmvc2/test1/toAjax.do ?????????* @return ?????????*/ ????????@RequestMapping("/toAjax.do") ????????public String toAjax() { ??????????????????return "ajax"; ????????} } |
5?TestController的內容如下:
| package com.rl.controller; ? import java.io.IOException; import java.io.PrintWriter; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; ? 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.servlet.ModelAndView; ? import com.rl.model.Person; import com.rl.model.User; ? @Controller @RequestMapping("test") //當前Controller的namespace,防止不同Controller中方法名重復的問題 public class TestController { ? ????????public TestController() { ??????????????????System.out.println("Controller被創建...."); ????????} ? ????????/** ?????????* desc:返回值類型是String,含義是ModelAndView中的viewname ?????????* ?????????* @RequestMapping:請求方法的映射,內容最好和方法名稱一致 ?????????* @author 涂作權 ?????????* @return ?????????*/ ????????@RequestMapping("/hello.do") ????????public String hello() { ??????????????????return "index"; ????????} ? ????????/** ?????????* desc:HttpServletRequest可以直接定義在方法的參數列表中來使用 ?????????* ?????????* @param request ?????????* @author 涂作權 ?????????* @return ?????????*/ ????????@RequestMapping("/getParam.do") ????????public String getParam(HttpServletRequest request) { ??????????????????String name = request.getParameter("name"); ??????????????????System.out.println(name); ??????????????????return "index"; ????????} ? ????????/** ?????????* desc:在參數的列表中來直接定義要接收的參數,參數名(形象)一定要 ?????????* ??????????? 和請求中傳遞的參數名(實參)一致,數據類型會自動的轉換,如果數據 ?????????* ??????????? 類型轉換出錯會報400錯誤??? ?????????* ?????????* @param name ?????????* @param id ?????????* @param age ?????????* @param address ?????????* @param birthday ?????????* @author 涂作權 ?????????* @return ?????????*/ ????????@RequestMapping("/getParam1.do") ????????public String getParam1(String name, Integer id, Integer age, ???????????????????????????String address, Date birthday) { ??????????????????System.out.println("姓名:" + name + "?id:" + id.getClass() + "?年齡:" ????????????????????????????????????+ age + " 地址: " + address + "生日:" + birthday); ??????????????????return "index"; ????????} ? ????????/** ?????????* desc:多選的接收在參數列表中定義數組來接收,參數名(形參)一定要和請求中傳遞的參數名(實參)一致,數據類型會自動的轉換, ?????????* 如果以字符串來接收的話會接收到一個以逗號分隔的一個字符串 ?????????* ?????????* @author 涂作權 ?????????* @param favor ?????????* @return ?????????*/ ????????@RequestMapping("/getParam2.do") ????????public String getParam2(String[] favor) { ??????????????????System.out.println(favor); ??????????????????for (String fa : favor) { ???????????????????????????System.out.println(fa); ??????????????????} ??????????????????return "index"; ????????} ? ????????/** ?????????* desc:接收實體對象,直接在參數列表中定義要接收的實體類就可以了,每次訪問的時候springmvc會自動創建相關參數的實體對象,對象中 ?????????* 的屬性值是通過請求傳遞過來并且注入到對象中 ?????????* ?????????* @author 涂作權 ?????????* @param person ?????????* @param user ?????????* @param name ?????????* @return ?????????*/ ????????@RequestMapping("/getParamByObj.do") ????????public String getParamByObj(Person person, User user, String name) { ??????????????????System.out.println(person); ??????????????????System.out.println(user); ??????????????????return "index"; ????????} ? ????????/** ?????????* 不建議使用 desc:返回值類型定義成ModelAndView,把數據和視圖注入到ModelAndView中返回即可 ?????????* ?????????* @return ?????????* @author 涂作權 ?????????* @throws Exception ?????????*/ ????????@RequestMapping("/returnData.do") ????????public ModelAndView returnData() throws Exception { ??????????????????Person p = new Person(); ??????????????????p.setId(1); ??????????????????p.setName("zhangsan"); ??????????????????p.setAge(22); ??????????????????p.setAddress("beijing"); ??????????????????p.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2013-08-05")); ??????????????????Map<String, Object> map = new HashMap<String, Object>(); ??????????????????// 相當于request.setAttribute("person", p); ??????????????????map.put("person", p); ? ??????????????????return new ModelAndView("index", map); ????????} ? ????????/** ?????????* 不建議使用 desc:返回值是String類型:viewName,參數是map,是ModelAndView中 map,不是接收參數的。 ?????????* ?????????* @author 涂作權 ?????????* @param map ?????????* @return ?????????* @throws Exception ?????????*/ ????????@RequestMapping("/returnData1.do") ????????public String returnData1(Map<String, Object> map) throws Exception { ??????????????????Person p = new Person(); ??????????????????p.setId(1); ??????????????????p.setName("zhangsan"); ??????????????????p.setAge(22); ??????????????????p.setAddress("beijing"); ??????????????????p.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2013-08-05")); ??????????????????// 相當于request.setAttribute("person", p); ??????????????????map.put("person", p); ??????????????????return "index"; ????????} ? ????????/** ?????????* 在參數列表中定義Model來給頁面返回數據 desc:建議使用 ?????????* ?????????* @author 涂作權 ?????????* @param model ?????????* @return ?????????* @throws Exception ?????????*/ ????????@RequestMapping("/returnData2.do") ????????public String returnData2(Model model) throws Exception { ??????????????????Person p = new Person(); ??????????????????p.setId(1); ??????????????????p.setName("zhangsan"); ??????????????????p.setAge(22); ??????????????????p.setAddress("beijing"); ??????????????????p.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2013-08-05")); ??????????????????// 相當于request.setAttribute("person", p); ??????????????????model.addAttribute("person", p); ??????????????????return "index"; ????????} ? ????????/** ?????????* desc:method=RequestMethod.POST該方法只能使用method指定的請求方式來指定 ?????????*/ ????????@RequestMapping(value = "/getParamByObjWithMethod.do", method = RequestMethod.POST) ????????public String getParamByObjWithMethod(Person person) { ??????????????????System.out.println(person); ??????????????????return "success"; ????????} ? ????????/** ?????????* desc:在參數列表中直接來定義HttpServletResponse,并且方法的返回值要定義void為ajax提供調用 ?????????* ?????????* @author 涂作權 ?????????* @param name ?????????* @param response ?????????*/ ????????@RequestMapping("/ajax.do") ????????public void ajax(String name, HttpServletResponse response) { ??????????????????String result = "hello" + name; ??????????????????try { ???????????????????????????response.getWriter().write(result); ??????????????????} catch (IOException e) { ???????????????????????????e.printStackTrace(); ??????????????????} ????????} ? ????????/** ?????????* desc:直接在參數列表中來定義PrintWriter建議使用 ?????????* ?????????* @param name ?????????* @param out ?????????*/ ????????@RequestMapping("/ajax1.do") ????????public void ajax1(String name, PrintWriter out){ ??????????????????String result = "hello " + name; ??????????????????out.write(result); ????????} ? ????????@RequestMapping("/toAjax.do") ????????public String toAjax(){ ??????????????????return "ajax"; ????????} ? ????????/** ?????????* 在同一個Controller中重定向語法 return后面 redirect:當前 ?????????*? ???????? Controller中方法的@RequestMapping的值 ?????????* ?????????* @return ?????????*/ ????????@RequestMapping("/redirectToAjax.do") ????????public String redirectToAjax(){ ??????????????????return "redirect:toAjax.do"; ????????} ? ????????/** ?????????* controller之間的重定向redirect:后面要有"/",代表從項目的根目錄開始 ?????????* ?????????* @return ?????????* @author 涂作權 ?????????*/ ????????@RequestMapping("/redirectToAjax1.do") ????????public String redirectToAjax1(){ ??????????????????return "redirect:/test1/toAjax.do"; ????????} ? ????????/** ?????????* 單純的轉發 ?????????* ?????????* @author 涂作權 ?????????* @return ?????????*/ ????????@RequestMapping("/toForm.do") ????????public String toForm(){ ??????????????????return "form"; ????????} ? ????????/** ?????????* 用于轉換數據類型 ?????????* @param binder ?????????*/ ????????@InitBinder ????????public void initBinder(ServletRequestDataBinder binder){ ??????????????????binder.registerCustomEditor(Date.class, ????????????????????????????????????new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); ????????} } |
6 UploadController的內容如下:
| package com.rl.controller; ? import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; ? import javax.servlet.http.HttpServletRequest; ? import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; ? import com.rl.model.Person; ? @Controller @RequestMapping("/upload") //當前Controller的namespace,防止不同Controller中方法名重復的問題 public class UploadController { ? ????????@RequestMapping("/uploadPic.do") ????????public String uploadPic(Person person, HttpServletRequest request) ???????????????????????????throws Exception { ??????????????????// 把request轉換成MultipartHttpServletRequest ??????????????????MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request; ??????????????????// 獲得文件,這里的pic是表單中的file字段對應的屬性名稱 ??????????????????MultipartFile mf = mr.getFile("pic");??????? ??????????????????// 獲得文件的字節數組 ??????????????????byte[] fbyte = mf.getBytes(); ??????????????????// 獲得當前時間的最小精度 ??????????????????String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS") ????????????????????????????????????.format(new Date()); ??????????????????// 追加三位隨機數 ??????????????????Random random = new Random(); ??????????????????for (int i = 0; i < 3; i++) { ???????????????????????????fileName = fileName + random.nextInt(10); ??????????????????} ??????????????????// 獲得原始文件名 ??????????????????String oriFileName = mf.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"; ????????} ? ????????@InitBinder ????????public void initBinder(ServletRequestDataBinder binder) { ??????????????????binder.registerCustomEditor(Date.class, new CustomDateEditor( ????????????????????????????????????new SimpleDateFormat("yyyy-MM-dd"), true)); ????????} } |
7?MyInterceptor的內容如下:
| package com.rl.interceptor; ? 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 MyInterceptor implements HandlerInterceptor{ ? ????????/** ?????????* 執行時機:在視圖解析器解析完畢之后,頁面一旦報錯異常會拋到該方法中, ?????????* try{}catch后面的finally,用于系統監控 ?????????*/ ????????public void afterCompletion(HttpServletRequest arg0, ???????????????????????????HttpServletResponse arg1, Object arg2, Exception ex) ???????????????????????????throws Exception { ??????????????????System.out.println("afterCompletion..................."); ??????????????????System.out.println("----------------------------------"); ??????????????????ex.printStackTrace(); ??????????????????System.out.println("----------------------------------"); ????????} ? ????????/** ?????????* 執行時機:Controller執行完畢,視圖解析器解析之前來執行 ?????????* 注意:此案例中如果是測試異步,這里的mv是null,此處會報錯。 ?????????* 解決辦法是注釋掉springmvc-servlet.xml中的攔截器的配置內容 ?????????*/ ????????public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, ???????????????????????????Object arg2, ModelAndView mv) throws Exception { ??????????????????Map<String, Object> map = mv.getModel(); ??????????????????map.put("test", "append something..."); ??????????????????System.out.println("postHandle..."); ????????} ? ????????/** ?????????* 返回值數據類型是布爾類型:true放行, false是阻止訪問 ?????????* 執行時機:Controller執行之前 ?????????* ?????????* 最常用的應用場景就是權限的攔截 ?????????*/ ????????public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, ???????????????????????????Object obj) throws Exception { ??????????????????System.out.println("preHandle..."); ??????????????????System.out.println(obj.getClass().getName()); ??????????????????return true; ????????} } |
8?Person的內容如下:
| package com.rl.model; ? import java.util.Date; ? publicclass Person { ???Integer id; ???String name; ???Integer age; ???String address; ???Date birthday; ??? ???/** ????* @return the id ????*/ ???public Integer getId() { ??????returnid; ???} ??? ???/** ????* @param id the id to set ????*/ ???publicvoid setId(Integer id) { ??????this.id = id; ???} ??? ???/** ????* @return the name ????*/ ???public String getName() { ??????returnname; ???} ??? ???/** ????* @param name the name to set ????*/ ???publicvoid setName(String name) { ??????this.name = name; ???} ??? ???/** ????* @return the age ????*/ ???public Integer getAge() { ??????returnage; ???} ??? ???/** ????* @param age the age to set ????*/ ???publicvoid setAge(Integer age) { ??????this.age = age; ???} ??? ???/** ????* @return the address ????*/ ???public String getAddress() { ??????returnaddress; ???} ??? ???/** ????* @param address the address to set ????*/ ???publicvoid setAddress(String address) { ??????this.address = address; ???} ??? ???/** ????* @return the birthday ????*/ ???public Date getBirthday() { ??????returnbirthday; ???} ??? ???/** ????* @param birthday the birthday to set ????*/ ???publicvoid setBirthday(Date birthday) { ??????this.birthday = birthday; ???} } |
9 User的內容如下
| package com.rl.model; ? publicclass User { ???Integer id; ???String name; ???/** ????* @return the id ????*/ ???public Integer getId() { ??????returnid; ???} ???/** ????* @param id the id to set ????*/ ???publicvoid setId(Integer id) { ??????this.id = id; ???} ??? ???/** ????* @return the name ????*/ ???public String getName() { ??????returnname; ???} ???/** ????* @param name the name to set ????*/ ??? ???publicvoid setName(String name) { ??????this.name = name; ???} ??? ???@Override ???public String toString() { ??????return"User [id=" +id +", name=" +name +"]"; ???} } |
10 ajax.jsp的內容如下:
| <%@page language="java"import="java.util.*"pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> ? <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ?<head> ???<basehref="<%=basePath%>"> ??? ???<title>My JSP 'index.jsp' starting page</title> ???<metahttp-equiv="pragma"content="no-cache"> ???<metahttp-equiv="cache-control"content="no-cache"> ???<metahttp-equiv="expires"content="0">??? ???<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> ???<metahttp-equiv="description"content="This is my page"> ???<scripttype="text/javascript"src="js/jquery.js"></script> ???<scripttype="text/javascript"> ???$(function(){ ??????$("#mybutton").click(function(){ ??????????console.log("test"); ??????????varmytext = $("#mytext").val(); ??????????$.ajax({ ?????????????url:"test/ajax1.do", ?????????????type:"post", ?????????????dataType:"text", ?????????????data:{ ?????????????????name:mytext ?????????????}, ?????????????success:function(responseText){ ?????????????????alert(responseText); ?????????????}, ?????????????error:function(){ ?????????????????alert("system error"); ?????????????} ??????????}); ??????}); ???}); ?????? ???</script> ?</head> ? ?<body> ??<inputtype="text"id="mytext"/> ??<inputid="mybutton"type="button"value="click"/> ?</body> </html> |
11 form.jsp的內容如下:
| <%@page language="java"import="java.util.*"pageEncoding="utf-8"%> ? <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ?<head> ??? ???<title>My JSP 'form.jsp' starting page</title> ??? ?</head> ? ?<body> ???<formaction="upload/uploadPic.do"method="post"enctype="multipart/form-data"> ???id:<inputname="id"type="text"/><br> ???name:<inputname="name"type="text"/><br> ???age:<inputname="age"type="text"/><br> ???address:<inputname="address"type="text"/><br> ???birthday:<inputname="birthday"type="text"/><br> ???pic:<inputtype="file"name="pic"/><br> ???<inputvalue="submit"type="submit"/> ???</form> ?</body> </html> |
12 index.jsp的內容如下:
| <%@page language="java"import="java.util.*"pageEncoding="utf-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%> ? <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ?<head> ??? ???<title>My JSP 'index.jsp' starting page</title> ??? ?</head> ? ?<body> ???<h1>${person.id}</h1> ???<h1>${person.name}</h1> ???<h1>${person.age}</h1> ???<h1>${person.address}</h1> ???<h1><fmt:formatDatevalue="${person.birthday }"pattern="yyyy-MM-dd"/></h1> ???<h1>${test }</h1> ?</body> </html> |
13 success.jsp的內容如下:
| <%@page language="java"import="java.util.*"pageEncoding="utf-8"%> ? <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ?<head> ??? ???<title>My JSP 'success.jsp' starting page</title> ??? ?</head> ? ?<body> ???success<br> ?</body> </html> |
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的02基于注解开发SpringMVC项目(jar包,异步,request,参数传递,多选的接收,Model传参,map传参,model传参,ajax,重定向,时间日期转换)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人人分期审核需要的材料
- 下一篇: 03SpringMVC,Spring,H