.Net轉Java自學之路—SpringMVC框架篇二(入門案例)

前端控制器配置,在web.xml中配置前端控制器。前端

<!-- springmvc前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- contextConfigLocation配置springmvc加載的配置文件(配置處理器映射器、適配器等)
        若不配置contextConfigLocation,則默認加載WEB-INF/servlet名稱-servlet.xml(springmvc-servlet.xml) -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 第一種:*.action,訪問以.action結尾,由DispatcherServlet進行解析
        第二種:/,全部訪問的地址都由DispatcherServlet進行解析,對靜態文件的解析須要配置不讓DispatcherServlet進行解析
            使用此種方式能夠實現RESTful風格的url
        第三種:/*,這個配置不對,使用此種配置,最終要轉發到一個jsp頁面時,
            仍然由DispatcherServlet進行解析jsp頁面,不能根據jsp頁面找到Handler,會報錯 -->
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

配置處理器適配器:在classpath下的springmvc.xml中配置處理器映射器。web

<!-- 配置 處理器適配器  全部的處理器適配器都實現HandlerAdapter接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
public class GoodsController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 調用service查找數據庫,查詢Goods信息列表。
        List<Goods> goodsList=null;
        
        //返回ModelAndView
        ModelAndView mav=new ModelAndView();
        //至關於request的setAttribute,在jsp中經過goodsList取數據。
        mav.addObject("goodsList", goodsList);
        //指定視圖
        mav.setViewName("goodslist.jsp");
        return null;
    }
}

配置Handler:將編寫的Handler在spring容器中加載。spring

<!-- 配置Handler -->
<bean name="/goods.action" class="cn.test.ssm.contruller.GoodsController"/>

  配置處理器映射器:在classpath下的springmvc.xml中配置處理器映射器。數據庫

<!-- 配置 處理器映射器
    BeanNameUrlHandlerMapping:將bean的name做爲url進行查找,須要在配置Handler時指定beanname(就是url)
    全部的映射器都實現了HandlerMapping接口。-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

非註解的處理器映射器:json

  org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter:編寫的Handler須要實現Controller接口。瀏覽器

  org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter:編寫的Handler須要實現HttpRequestHandler接口。mvc

  配置HttpRequestHandlerAdapter的適配器:app

<!-- 配置屬於HttpRequestHandlerAdapter的Handler -->
<bean id="httpGoodsController" name="/httpgoods.action" class="cn.test.ssm.contruller.HttpGoodsController"/>

<!-- 另外一個適配器:HttpRequestHandlerAdapter配置 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

  將配置的Handler加入url映射配置:jsp

<!-- 另外一個映射器:SimpleUrlHandlerMapping映射
    簡單的url映射配置 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- prop的value爲配置Handler的id值
                對goodsController進行url映射 -->
            <prop key="/goods1.action">goodsController</prop>
            <prop key="/goods2.action">goodsController</prop>
            <!-- 對屬於HttpRequestHandlerAdapter適配器的Handler進行url映射 -->
            <prop key="/httpgoods.action">httpGoodsController</prop>
        </props>
    </property>
</bean>
public class HttpGoodsController implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        List<Goods> goodsList=null;
        request.setAttribute("goodsList", goodsList);
        request.getRequestDispatcher("/goodslist.jsp").forward(request, response);
    }
}

  使用此方法能夠經過修改response,設置相應的數據格式。如:相應的Json數據。ide

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().wait("Json串");

  在前端控制器從spring-webmvc-5.1.5.RELEASE.jar/org.springframework.web.servlet/DispatcherServlet.properties的文件加載處理器映射器、適配器、視圖解析器等組件。若再也不springmvc.xml中配置,使用默認加載的。

註解的處理器映射器和適配器:

  在spring3.1以前使用org.springframework.web.servlet.mvc.method.annotation.DefaultAnnotationHandlerMapping註解映射器、org.springframework.web.servlet.mvc.method.annotation.AnnotationMethodHandlerAdapter註解適配器。

  在spring3.1以後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping註解映射器、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter註解適配器。

<!-- 配置註解處理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置註解處理器適配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 使用mvc:annotation-driven代替上面註解映射器和註解適配器配置
    mvc:annotation-driven默認加載不少的參數綁定方法。
    如:json轉換解析器就會默認加載,若使用mvc:annotation-driven不用配置RequestMappingHandlerMapping和RequestMappingHandlerAdapter
    實際開發中使用mvc:annotation-driven -->
<mvc:annotation-driven></mvc:annotation-driven>
//註解的Handler  在使用註解的映射器和適配器時,註解的映射器和適配器必須配對使用。
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
/**
 * 使用@Controller標識該類爲一個控制器。
 */
@Controller
public class ZJGoodsController {
    
    /*
     * @RequestMapping實現對方法和url進行映射,一個方法對於一個url
     * 通常建議將url和方法保持一致。後面的action是可選的
     */
    @RequestMapping("/testFun.action")
    public ModelAndView testFun()throws Exception{
        List<Goods> goodsList=null;
        ModelAndView mav=new ModelAndView();
        mav.addObject("goodslist",goodsList);
        mav.setViewName("jsp頁面路徑");
        return mav;
    }
    
    @RequestMapping("/query")
    public ModelAndView query()throws Exception{
        List<Goods> goodsList=null;
        ModelAndView mav=new ModelAndView();
        mav.addObject("query",goodsList);
        mav.setViewName("jsp頁面路徑");
        return mav;
    }
}

  在spring容器中加載Handler:

<!-- 對於註解的Handler能夠單獨配置 -->
<bean class="cn.test.ssm.contruller.ZJGoodsController"/>
<!-- 註解的Handler單獨配置比較繁瑣,爲方便開發,使用組件掃描來代替。
    能夠掃描controller、service等 -->
<context:component-scan base-package="cn.test.ssm.contruller"></context:component-scan>

controller方法返回值:

  ModelAndView:
    返回值爲ModelAndView,須要在方法結束時,定義ModelAndView,將model和view分別進行設置。

  String:
    若controller方法返回String。
    一、表示返回邏輯視圖名:真正視圖(jsp視圖) = 前綴 + 邏輯視圖名 + 後綴。

@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST})
public String query(Model model)throws Exception{
    List<Goods> goodsList=null;
    //ModelAndView mav=new ModelAndView();
    //mav.addObject("query",goodsList);
    //mav.setViewName("jsp頁面路徑");
    //當方法返回值爲String時,須要把Model做爲形參傳遞到方法中,經過形參的model將model中數據傳遞到頁面。
    //model.addAttribute至關於ModelAndView.addObject
    model.addAttribute("query",goodsList);
    return "jsp頁面路徑";
}

    二、redirect重定向:如修改功能完成後,重定向到查詢列表頁。redirect重定向特色:瀏覽器地址欄中url會變化。修改提交的request數據沒法傳到重定向的地址。由於重定向後從新進行request。也就是request沒法共享。如:

@RequestMapping("/edit")
public String edit()throws Exception{
    return "redirect:query.action";
}

    三、forward頁面轉發:經過forward進行頁面轉發,瀏覽器地址欄URL不變,request能夠共享。

@RequestMapping("/edit")
public String edit()throws Exception{
    return "forward:query.action";
}

  void:

    在controller方法形參中能夠定義request和response,使用request和response指定響應結果。

    一、使用request轉發頁面:request.getRequestDispatcher("頁面路徑").forward(request,response);

    二、使用response重定向:response.sendRedirect("頁面路徑");

    三、使用response指定響應結果。如響應JSON數據:

response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("JSON串")
相關文章
相關標籤/搜索