web.xml文件配置css
spring文件配置web
spring mvc Ajax兩種實現方式spring
spring註解標籤express
spring 自動注入機制json
ibatis 學習spring-mvc
jstl 的簡單使用服務器
Spring mvc 主要做用於UI層,接受URL請求,返回頁面。mvc
其實就是spring mvc 做爲一個攔截器,首先它須要攔截全部的請求,不管是動態的仍是靜態的資源,所以全部的第一步都須要在web.xml文件中去配置一個攔截器,不一樣的框架由不一樣的攔截器,固然通常都會定義一些規則,能夠選擇性的攔截。(這些框架都是基於Servlet的,struts2 也是如此)app
<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則只會在使用時加載。
<?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()中設爲:」 redirect:name」
接下來要將到的是@Controller
咱們來看一個類:
@Controller
@RequestMapping( "user")
public class UserController {
//
}
那麼這個類就會處理URL中這樣格式的請求:
/svc/user/*
(其中 svc 爲咱們在web.xml中定義的攔截規則 ,user爲 類上的@RequestMapping ,url中剩餘部分則須要則類中的方法上進行匹配 )
接下來我講一下 spring mvc中Ajax的實現方式(我的的理解)
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,對於咱們使用框架來講,應該充分利用它的功能,所以不推薦使用;
使用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的含義就是異步請求,你在一個頁面請求服務器資源,正常狀況是一個請求到服務器,服務器經過應用程序處理你的請求,返回相應的頁面,所以一個請求就表明一個頁面,可是有時咱們不但願頁面刷新,只但願返回咱們須要的數據,這時就須要異步的方式了)
經過@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");
}
用@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()
}
直接用HttpServletRequest獲取
@RequestMapping(method = RequestMethod.GET)
public ModeAndView get(HttpServletRequest request, HttpServletResponse response) {
System.out.println(request.getParameter("a"));
return new ModeAndView(「welcome」);
}
用註解@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」);
}
@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的部分,見下一篇博客