spring MVC詳解,springmvc詳解
1:Spring中的核心類:
DispathcerServlet - 對應的就是 PreparedAndExecuteFilter
Controller - Action (介面) <action name=”xxx”/>
<reslut name=”success”>/aaa.jsp</result>
MultiActionController - ActionSupport
HandlerInterceptor Interceptor
HandlerMapping - 映射請求的url
ViewResolver – 處理處理完成以後,決定顯示哪一個頁面。
2:快速入門
第一步:建立一個web項目,導spring包
第二步:在web.xml中配置核心Servlet - DispatcherSerlvet
DispatcherSerlvet –
<servlet>
<servlet-name>kunx</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 可選的配置一個初始化參數,設定初始時讀取的設定檔,
預設的讀取的:web-inf:/<serlvet-name>-servlet.xml
-->
<init-param>
<param-name>namespace</param-name>
<param-value>spring-servlet</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>kunx</servlet-name>
<!-- 所有以spring/*url都會訪問DispatcherSevlet -->
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
第三步:在web-inf目錄下建立一個spring-sevlet.xml
(略)
第四步:配置HandlerMapping
作用就是用來解析url的,哪一個url對應哪一個Action。
配置SimpleUrlHandlerMapping:
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 哪一個url對應哪一個Action(Controller) -->
<property name="mappings">
<props>
<!-- key是指url,http://local:8080/spring1/spring/one -->
<prop key="/one">oneAction</prop>
</props>
</property>
</bean>
第五步:實現一個Controller
建立一個類:
public class OneAction implements Controller{
public Model AndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.err.println("Hello這是第一個測試。。。。");
return null;
}
}
將上面的類在spring-servlet.xml中配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- 配置url映射
id是可以省略
-->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 哪一個url對應哪一個Action(Controller) -->
</bean>
<!-- 配置自己的第一個Action -->
<bean id="oneAction" class="cn.kunx.actions.OneAction"/>
</beans>
第六步:設定ViewResolver – 解析訪問Action成功以後返回到哪一個頁面
InternalResourceViewResolver
根據一個路徑,確定一個資源的名稱:
<!-- 配置解析視圖資源的解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 頁面的路徑首碼 -->
<property name="prefix" value="/WEB-INF/jsps/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
總結:
DispatcherServlet – web.xml
Handlermapping – SimpleUrlHandlerMapping – beans.xml
ViewResolver – InternalResourceViewResolver – beanx.xml
我們自己的Action(Controller)
3、ModelAndView封裝資料
功能:1:通過一個[字串,轉到某個特定的頁面。new ModelAndView("succ"); - /WEB-INF/jsps/succ.jsp
2:向request中封裝資料。
Map<String,Object> mm = new HashMap<String, Object>();
mm.put("name","Jack");//req.setAttributre(name,jack);
mm.put("addr", "中國北京");
//request.setAttribute("name", "jack");
ModelAndView mv = new ModelAndView("succ","mm",mm);
4、動態方法引動過程
http://localhost:8080/project/some!one.action
<action name=”some!*” method=”${1}” class=”xxxx”>
</action>
自己實現的Controller類,必須要繼承MultiActionController
第一步:繼承了MultiActionController的類可以是以下方法:
public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession] [,AnyObject] );
第二步:Spring通過一個類解析方法:
MethodNameResolver -
用ParamenterMethodNameResolver – 在ur後面的參數,決定了執行某個方法:
第三步:建立一個類實現MultiActionController
public class TwoAction extends MultiActionController {
//沒有返回值,也會指向一個頁面
public void abc(HttpServletRequest req,HttpServletResponse resp){
System.err.println("abc...."+req);
}
public String a2(HttpServletRequest req,HttpServletResponse resp,
HttpSession s){
System.err.println("A2......"+req);
return "succ";
}
public String a3(HttpServletRequest req,HttpServletResponse resp,
HttpSession s,User u){
System.err.println("a3...."+u);
return "succ";
}
}
第四步:配置方法動態解析類
MethodNameResolver
<!-- 配置方法名解析 -->
<bean id="methodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="defaultMethodName" value="execute "></property>
<!-- ?cmd=xxxx -->
<property name="paramName" value="cmd"> </property>
</bean>
第五步:在spring-servlet.xml中配置twoAction
<bean id="twoAction" class="cn.kunx.actions.TwoAction">
<!-- 注入方法解析器 -->
<property name="methodNameResolver" ref="methodResolver"></property>
</bean>
第六步:在handlermapping中配置twoAction
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 哪一個url對應哪一個Action(Controller) -->
<property name="mappings">
<props>
<!-- key是指url,http://local:8080/spring1/spring/one -->
<prop key="/one">oneAction</prop>
<prop key="/two">twoAction</prop>
</props>
</property>
</bean>
5、深入研究轉寄處理器-HandlerMapping
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 哪一個url對應哪一個Action(Controller) -->
<property name="mappings ">
<props>
<!-- key是指url,http://local:8080/spring1/spring/one -->
<prop key="/one ">oneAction </prop>
<prop key="/two">twoAction</prop>
</props>
</property>
<property name="urlMap">
<map>
<entry key="/a" value-ref="oneAction"/>
<entry key="/b" value-ref="twoAction"/>
</map>
</property>
</bean>
6、BeanNameUrlHandlerMapping
根據bean的name屬性,決定執行哪一個Controller。
<bean name=”/abc” class=”someController”/>
http://loclahost:8080/project/spring/abc
載入多個設定檔:建議使用ContextLoaderListener實現:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:beans*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
第一步:在建立一個新的beans.xml
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>
第二步:書寫一個Controller
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class ThreeAction extends MultiActionController{
public ModelAndView a1(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.err.println("Threee a1.....");
return new ModelAndView("succ");
}
public ModelAndView a2(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.err.println("Threee a2.....");
return new ModelAndView("succ");
}
}
第三步:配置name屬性
<bean name="/three" class="cn.kunx.actions.ThreeAction">
<property name="methodNameResolver" ref="methodResolver"></property>
</bean>
http://localhost:8080/project/spring/three?cmd=a1就可以訪問了;
7、用ResourceBundleViewResolver通過讀取一個資源檔,確定一個視圖頁面
第一步:在beans.xml中配置ResourceBundleViewResolver
<!-- 配置一個新的viewResolver -->
<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basenames">
<array>
<value>views</value>
</array>
</property>
</bean>
第二步:在classpath下建立一個views.properties
#設定一個預設的url,及處理類
default.(class)=org.springframework.web.servlet.view.JstlView
default.url=/jsps/a.jsp
page1.url=/jsps/b.jsp
7、最好的組合
第一步:
第二步:
在src目錄下,建立一個公用的設定檔:beans.xml
配置
BeanNameUrlHandlerMapping
ResourceBundlerViewResolver
ParameterMethodNameResolver
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basenames">
<list>
<value>views</value>
</list>
</property>
<property name=”defaultParentView” value=”kunx”/>
</bean>
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean id="methodNameResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="defaultMethodName" value="execute"/>
<!-- ?method=someMethod -->
<property name="paramName" value="method"></property>
</bean>
第三步:在web.xml中配置上面的base.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/conf/base.xml,
classpath:beans*.xml
</param-value>
</context-param>
第四步:建立views.properties
kunx.(class)=org.springframework.web.servlet.view.JstlView
kunx.url=/jsps/kunx.jsp
a.url=/jsps/a.jsp
b.(class)=org.springframework.web.servlet.view.RedirectView
b.contextRelative=true
b.url=/jsps/b.jsp
第五步:書寫自訂類
public class OneController extends MultiActionController{
public ModelAndView execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.err.println("execute....");
return null;
}
public String a(HttpServletRequest request,
HttpServletResponse response){
System.err.println("aaaaaaaaaaaa");
return "a";
}
public String b(HttpServletRequest request,
HttpServletResponse response){
System.err.println("bbbbbbb");
return "b";
}
}
第六步:在beans.xml中配置
<bean name="/one" class="cn.kunx.controller.OneController">
<property name="methodNameResolver" ref="methodNameResolver"></property>
</bean>
第七步:運行測試:
http://localhost:8080/project/spring/one?cmd=a
7、通過註解實現SpringMVC
@Controller – 加在POJO上,讓一個類變成一個Controller。
<context:component-scan packge=”xxx”/> -
@ReqeustMapping - 設定訪問的路徑
@RequestParam - 參數
@PathVariable – 在路徑中的參數 -RESTful – 靜態地址轉換。 - http:///project/person/Jack/90;