Spring mvc ,spring ,ibatis 學習記錄(1)

web.xml文件配置css

spring文件配置web

spring mvc Ajax兩種實現方式spring

spring mvc 傳值方式數據庫

spring註解標籤express

spring 自動注入機制json

ibatis 學習spring-mvc

jstl 的簡單使用服務器

Spring mvc 主要做用於UI層,接受URL請求,返回頁面。mvc

         其實就是spring mvc 做爲一個攔截器,首先它須要攔截全部的請求,不管是動態的仍是靜態的資源,所以全部的第一步都須要在web.xml文件中去配置一個攔截器,不一樣的框架由不一樣的攔截器,固然通常都會定義一些規則,能夠選擇性的攔截。(這些框架都是基於Servlet的,struts2 也是如此)app

         那麼如何設置spring mvc的攔截器呢:

    <servlet>

          <servlet-name>svcEngine</servlet-name>

          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

          <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/rest-servlet.xml</param-value>

          </init-param>

          <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

        <servlet-name>svcEngine</servlet-name>

        <url-pattern>/svc/*</url-pattern>

  </servlet-mapping>

   如何理解這段內容呢?

  

<url-pattern> 開始,若是請求的URL中存在 /svc/ 這樣的形式,那麼這個URL請求就交給 類:

org.springframework.web.servlet.DispatcherServlet    去處理(至於它是怎麼作的,若是不是爲了本身寫框架,不須要關心)

 

 

說一下contextConfigLocation 的做用吧:  

              spring中,若是不指定 contextConfigLocation ,那麼默認會加載 WEB-INF/applicationContext.xml這個文件,若是指定了這個,就會加載<param-value>中的文件,多個文件以逗號隔開,默認爲根目錄,即你的項目那一級目錄.

 <context-param>

         <param-name>contextConfigLocation</param-name>

         <param-value>WEB-INF/conf/*.xml</param-value>

</context-param>

自定義如要在容器啓動時加載的文件

 

注意,若是設置contextConfigLocation,須要配置:

 <listen> 

     <listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listen>

 

<load-on-startup>  多個文件表示的是Servlet的加載順序,咱們在web.xml中定義了一個<servlet>,可是何時去初始化這個Servlet呢,就能夠再 <load-on-startup>中定義,只能是一個數字,不小於0表示在容器啓動時就去初始化 加載這個servlet,小於0則只會在使用時加載。

 

 

接下來講的是spring的配置文件:內容以下:

 

<?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:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

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.2.xsd 

   http://www.springframework.org/schema/context 

   http://www.springframework.org/schema/context/spring-context-3.2.xsd 

   http://www.springframework.org/schema/mvc 

   http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 

   http://www.springframework.org/schema/tx

   http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

    "> 

<!-- annotation   --> 

      <context:component-scan base-package="*" use-default-filters="false">

      <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />

       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />

       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />

     </context:component-scan>

<!—spring mvc對靜態資源的過濾,即若是是定義的URL視爲靜態資源,不通過攔截器-->

<mvc:resources location="/scripts/" mapping="/scripts/css/**"/> 

<!—spring  mvc@Controller的分發請求有關係  -->

    <mvc:annotation-driven >

         <mvc:message-converters>

             <ref bean="jsonConverter"/>

          <!—json的形式發送數據 -->

         </mvc:message-converters>

    </mvc:annotation-driven>   

    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

         <property name="supportedMediaTypes" value="*/*" />

     </bean>

         <!-- view Resolver -->   

     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        

         <property name="prefix" value="/views/"/>     

         <property name="suffix" value=".jsp"/>     

     </bean>          

</beans>

 

當客戶端發送一個URL請求,若是和spring  mvc 設置的URL匹配規則相符合,則接下來的處理交給spring mvc處理。

<context:component-scan base-package="*" use-default-filters="false">

定義掃描規則,base-package 則是要掃描的包,若是在這些包下面的類打上了 @Component@Controller,@Service,@Repository 這些註解,那麼就在這些類裏面查找對應的處理方法   

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />

表示 @Controller 註解的 接受處理

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />

表示@Service 註解的類 不接受處理。  若是設置 exclude 或者 include,則須要設置 use-default-filters

 (Indicates whether automatic detection of classes annotated with @Component, @Repository, @Service, or @Controller should be enabled. Default is "true".  這是官方的解釋)  意思就是:將use-default-filters 設置爲false,那麼就不會自動檢測打上這些標註的類,而是將規則交給 <context:exclude-filter> <context:include-filter>處理。

 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        

         <property name="prefix" value="/views/"/>     

         <property name="suffix" value=".jsp"/>     

     </bean> 

定義返回的規則,舉例來講:

     @RequestMapping(value="login",

method={RequestMethod.POST,RequestMethod.GET})

     public ModelAndView login(@ModelAttribute Login pojo)

     {

         System.out.println(pojo.getUid()+":"+pojo.getPwd());

         ModelAndView mv=new ModelAndView();

         if(_userManager.login(pojo))

         {

              mv.addObject("info",pojo.getUid());

         }else{

              mv.addObject("info","error");

         }

         mv.setViewName("user/index");

         return mv;

     }

}

ModeAndView 顧名思義 就是 數據和視圖,將要返回的頁面和數據綁定到一塊

返回一個 ModeAndView,設置一個viewName,如: user/index ,那麼根據bean裏面定義的規則,返回的頁面就是: views/user/index.jsp   ,自動爲每個返回視圖添加一個前綴 views 和一個文件名.jsp.

有時候咱們須要在一個ModeAndView 中跳轉到另一個ModeAndView中,那麼能夠再setViewName()中設爲:」 redirectname」

 

接下來要將到的是@Controller

咱們來看一個類:

@Controller

@RequestMapping( "user")

public class UserController {

     //

}

那麼這個類就會處理URL中這樣格式的請求:

/svc/user/*      

 (其中 svc 爲咱們在web.xml中定義的攔截規則 user 類上的@RequestMapping ,url中剩餘部分則須要則類中的方法上進行匹配 )

 

  接下來我講一下 spring mvcAjax的實現方式(我的的理解)

  1. Servlet方式,

  @RequestMapping(value="validate_userName",method=RequestMethod.GET)

     public ModelAndView  validateUserName(@RequestParam("userName") String userName ,HttpServletRequest request,HttpServletResponse response)

     {

          PrintWriter writer=null;

         try {

              writer = response.getWriter();

         } catch (IOException e) {

              e.printStackTrace();

         }   

         if(userBizImp.isExist(userName))

         {    writer.write("exist");

         }else{

              writer.write("ok");

         }

         writer.flush();

         writer.close();

         return null;

     }

直接調用 PrintWriter 去打印,然會返回null,不要返回一個ModeAndView.

這種方式感受就像避開了spring mvc,對於咱們使用框架來講,應該充分利用它的功能,所以不推薦使用;

 

  1. 使用spring mvc @ResponseBody

@RequestMapping("getall")

     public @ResponseBody List<User>   getAll(  ) {

         List<User> lst = _userManager.getall();

         return lst;

     }

這種方式直接就能夠講內容以json的形式返回 ,你能夠返回 String,對象,列表等。固然你可能須要配置一下它,使它對於返回的格式作一些處理。能夠參考這個:

<mvc:annotation-driven >

         <mvc:message-converters>

             <ref bean="jsonConverter"/>

          <!—json的形式發送數據 -->

         </mvc:message-converters>

    </mvc:annotation-driven>   

    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

         <property name="supportedMediaTypes" value="*/*" />

     </bean>

 

這裏說的兩種都是後臺的實現方式,前臺就是直接 Ajax 請求就行。(Ajax的含義就是異步請求,你在一個頁面請求服務器資源,正常狀況是一個請求到服務器,服務器經過應用程序處理你的請求,返回相應的頁面,所以一個請求就表明一個頁面,可是有時咱們不但願頁面刷新,只但願返回咱們須要的數據,這時就須要異步的方式了)

 

接下來講的是就是spring mvc中傳值問題了:

  1. 經過@PathVariabl註解獲取路徑中傳遞參數

    @RequestMapping(value = "/{id}/{str}")
     
    public ModelAndView index(@PathVariable String id, @PathVariable String str) {
           System.out.println(id);
           System.out.println(str);
           
    return new ModelAndView("/index");
    }

  2. @ModelAttribute註解獲取POST請求的FORM表單數據

@RequestMapping(value=」index」,method = RequestMethod.POST)
public ModeAndView index(@ModelAttribute("user") User user) {
      
return new ModeAndView("welcome");
 }

 

public class User{
 
private String name;
 
private int pwd;

setter()

getter()
}

 

  1. 直接用HttpServletRequest獲取

    @RequestMapping(method = RequestMethod.GET)
    public ModeAndView get(HttpServletRequest request, HttpServletResponse response) {
         System.out.println(request.getParameter("a"));
        
    return new ModeAndView(「welcome」);
    }

  2. 用註解@RequestParam綁定請求參數a到變量a

當請求參數a不存在時會有異常發生,能夠經過設置屬性required=false解決,
例如: @RequestParam(value="a", required=false)
@RequestMapping(value = "/index", method = RequestMethod.GET)
public ModeAndView index(@RequestParam("a") String a) {
      System.out.println(a);
     return new ModeAndView(「inded」);

} 

 

Spring 註解標籤

@Component  ,@Repository , @Service ,  @Controller

@Component 至關因而其它三個的父類, 其它三個職責更加明確了。

@Repository 標註的是數據庫持久層

@Service  標註的是業務邏輯層

@Controller  標註的則是控制層

咱們爲一個類添加了這些註解標籤以後,組件的自動掃描機制就會在類路徑底下尋找到它,實例一個對象添加到spring容器中,默認是以單例的形式,固然咱們能夠經過 @Scope」prototype」)來改變。getBean的默認名稱是 類名(首字母小寫),能夠自定義 ,如:@Service」name」

           Spring存在一種自動注入的機制,你不須要顯示的經過context.getBean(「name」) 去獲取對象實例,而是能夠經過一些標籤便可作到。下面以一個例子來說解:

    

 

@Service(「userService」)

public  class  UserService{

      public void show(){

       System.out.println(「hello 「);

       

}

 

@Controller

Public class UserController{

    @Resource(name=」userService」)

UserService _userService;

@RequestMapping(「login」)

public  ModeAndView login(){

     _userService.show();  //直接就可使用 _userService

}  

}

@Autowired   byType 方式自動注入,默認要求依賴的而對象必須存在,固然也能夠指定注入bean的名稱,經過 @Qualifier 來指定

@Resource  默認按byName自動注入

 

 

        由於字數限制問題,關於iBATIS的部分,見下一篇博客

相關文章
相關標籤/搜索