首页 > 代码库 > spring MVC详解

spring MVC详解

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=http://www.mamicode.com/"/WEB-INF/jsps/">
<property name="suffix" value=http://www.mamicode.com/".jsp">
</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=http://www.mamicode.com/"execute ">
<!-- ?cmd=xxxx -->
<property name="paramName" value=http://www.mamicode.com/"cmd">
</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=http://www.mamicode.com/”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=http://www.mamicode.com/"execute"/>
<!-- ?method=someMethod -->
<property name="paramName" value=http://www.mamicode.com/"method">
</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;
  









spring MVC详解