本文爲博主辛苦總結,但願本身之後返回來看的時候理解更深入,也但願能夠起到幫助初學者的做用.
轉載請註明 出自 : luogg的博客園 謝謝配合!
前端請求request,經過DispatcherServlet前端核心處理器,到達handlerMapping處理器映射,而後進入控制器Controller,將用戶處理的業務封裝到一個Bean(ModelAndView)中,而後經過試圖解析器ViewResolver返回給前臺頁面.前端
<!-- 配置核心分發器 --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 啓動容器時初始化該Servlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <!-- 表示那些請求交給spring mvc 處理 --> <url-pattern>*.do</url-pattern> </servlet-mapping>
public class HomeController extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub System.out.println(request.getRequestURI());//springmvc/home.do System.out.println(request.getRequestURL());//http://localhost/springmvc/home.do return new ModelAndView("index"); } }
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
a.action,b.action,c.action訪問的是一個controller <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <!-- 支持多個url,訪問同一個Controller,按id屬性訪問 --> <property name="mappings"> <props> <prop key="/a.action">hiController</prop> <prop key="/b.action">hiController</prop> <prop key="/c.action">hiController</prop> </props> </property> </bean>
@Controller//標示這 個 類爲一個控制器 public class HomeController { @RequestMapping("/home.do")//訪問的url public String hello(HttpServletRequest request){ System.out.println(request.getRequestURL()); return "hello";//返回到指定頁面 } }
<!-- 對全部的Controller進行包掃描 --> <context:component-scan base-package="com.luogg.controller"/> <!-- 內部資源視圖解析器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean>
<!-- 管理springmvc --> <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:com/luogg/resources/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
在瀏覽器輸入 http://localhost/springmvc_new/home.do
時候會調到pages目錄下的hello.jsp頁面java
spring負責管理service,dao,並加入自動掃描
@Service表示這個類是Service類web
springmvc負責controller,並自動掃描controller層
@Controller表示這個類是controller
@RequestMapping表示用戶敲入的url
在controller中,將集合給前臺頁面,這個集合是model對象,也是map集合,頁面就會以jstl的方式來訪問.
return表示返回到的前臺頁面spring
/** * 查詢全部用戶信息 * @return */ public List<Person> querryAll(){ List<Person> list = new ArrayList<Person>(map.values()); return list; }
<!-- 內部資源視圖解析器 --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean>
/** * 展現全部用戶信息 * @param model * @return */ @RequestMapping("/person/querryAll.do") public String querryAll(Map<String,Object> model){ List<Person> list = personService.querryAll(); model.put("list", list); return "/person/view"; }
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<table border="1"> <tr> <td>選擇</td> <td>用戶ID</td> <td>用戶姓名</td> <td>用戶年齡</td> <td>修改</td> <td>刪除</td> </tr> <c:forEach items="${list}" var="p"> <tr> <td><input type="checkbox" name="id" value="${p.id}"/></td> <td>${p.id}</td> <td>${p.name}</td> <td>${p.age}</td> <td><a href="${pageContext.request.contextPath}/person/edit.do?id=${p.id}" >修改</a></td> <td><a href="${pageContext.request.contextPath}/person/deleteById.do?id=${p.id}" >刪除</a></td> </tr> </c:forEach> </table>
前端連接跳轉後端處理的代碼 <a href="${pageContext.request.contextPath}/person/deletePersons.do">批量刪除</a>
${pageContext.request.contextPath}後端
當新增用戶,輸入日期時候,會400,報錯,在controller中加入以下代碼,就會不抱錯.瀏覽器
@InitBinder //此方法用於日期的轉換,若是未加,當頁面日期格式轉換錯誤,將報400錯誤,實際是由於此方法 public void initBinder(WebDataBinder binder) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(true); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); }
在edit.jsp頁面加入springmvc自定義標籤服務器
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
mvc
form標籤用自定義標籤代替,modelAttribute表示controller中的對象 <sf:form action="${pageContext.request.contextPath}/person/update.do" method="post" modelAttribute="p"> <td>用戶名 :</td> <sf:input path="name"/></td> </sf:form>
<sf:form action="${pageContext.request.contextPath}/person/update.do" method="post" modelAttribute="p" enctype="multipart/form-data"> <tr> <td>圖片上傳 :</td> <td><input type="file" name="fileUpload"/> </tr>
<!-- 文件上傳視圖解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"></property> </bean>
/** * 修改並展現 * @throws IOException */ @RequestMapping("/person/update.do") public String update(Person p,@RequestParam(required=true)MultipartFile fileUpload) throws IOException{ /** * 上傳文件寫入磁盤 */ //從字節到文件 FileUtils.writeByteArrayToFile(new File("D:\\1.jpg"), fileUpload.getBytes()); personService.updatePerson(p); return "redirect:/person/querryAll.do"; }