SpringMVC學習筆記

本文爲博主辛苦總結,但願本身之後返回來看的時候理解更深入,也但願能夠起到幫助初學者的做用.

轉載請註明 出自 : luogg的博客園 謝謝配合!

SpringMVC學習筆記

一.HelloWorld SpringMVC

這裏寫圖片描述

前端請求request,經過DispatcherServlet前端核心處理器,到達handlerMapping處理器映射,而後進入控制器Controller,將用戶處理的業務封裝到一個Bean(ModelAndView)中,而後經過試圖解析器ViewResolver返回給前臺頁面.前端

  • 1.在web.xml中配置前端核心處理器DispatcherServlet
<!-- 配置核心分發器 -->
    <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>
  • 2.編寫Controller
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");
    }
}

二.經常使用的HandlerMapping處理器映射

  • 1.BeanNameUrlHandlerMapping(默認)
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  • 2.SimpleUrlHandlerMapping
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>

三.註解方式(springmvc3.0以後全面支持註解方式)

  • 1.建立一個web工程
  • 2.加入jar包
  • 3.建立一個Controller,註解方式
@Controller//標示這 個 類爲一個控制器
public class HomeController {
    @RequestMapping("/home.do")//訪問的url
    public String hello(HttpServletRequest request){
        System.out.println(request.getRequestURL());
        return "hello";//返回到指定頁面
    }
}
  • 4.配置它的核心配置文件,包自動掃描.
<!-- 對全部的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>
  • 5.配置web.xml
<!-- 管理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>
  • 6.發佈,測試.

在瀏覽器輸入 http://localhost/springmvc_new/home.do時候會調到pages目錄下的hello.jsp頁面java

四.與Spring進行整合

spring負責管理service,dao,並加入自動掃描
@Service表示這個類是Service類web

springmvc負責controller,並自動掃描controller層
@Controller表示這個類是controller
@RequestMapping表示用戶敲入的url
在controller中,將集合給前臺頁面,這個集合是model對象,也是map集合,頁面就會以jstl的方式來訪問.
return表示返回到的前臺頁面spring

五.springMVC於spring整合的小demo

  • 1.com.luogg.entity表示實體包,建立person類,寫入id,name,sex,age屬性並加入set,get,toString方法.
  • 2.com.luogg.service表示業務層,建立PersonService類,在類的前邊用@Service標註,而且在com.luogg.resource包中添加appliacationContext.xml表示spring的配置文件,加入自動掃描包註解.
  • 3.在service中寫一個查詢全部用戶的方法
/**
     * 查詢全部用戶信息
     * @return
     */
    public List<Person> querryAll(){
        List<Person> list = new ArrayList<Person>(map.values());
        return list;
    }
  • 4.編寫controller層,先後端控制器,用@Resource註解表示注入Service層的類,在springmvc-servlet.xml中配置自動掃描controller註解,並加入內部資源視圖解析器
<!-- 內部資源視圖解析器 -->
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
  • 5.編寫controller中的方法,@RequestMapping("/person/querryAll.do")表示前端頁面中點擊querryAll.do連接以後進入這個方法,而後將數據返回到view.jsp頁面
/**
     * 展現全部用戶信息
     * @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";
    }
  • 6.編寫view.jsp頁面,循環展現數據,引入jstl<%@ 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}後端

六.SpringMVC加強

6.1日期的處理

當新增用戶,輸入日期時候,會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));
    }
6.2springMVC自定義標籤(輸入框回顯)

在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>
6.3文件上傳
  • 1.在jsp頁面form標籤添加屬性enctype,在table中添加input type=file.
<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>
  • 2.在springmvc的xml中配置文件上傳視圖解析器
<!-- 文件上傳視圖解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>
  • 3.修改controller層,添加MultipartFile參數,並導包commons-fileupload.jar和commons-io.jar
/**
     * 修改並展現
     * @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";
    }
6.4服務器端檢驗(不重要)
相關文章
相關標籤/搜索