spring mvc 控制器

本文介绍SpringMVC环境配置步骤,包括动态web工程搭建、依赖包引入、DispatcherServlet配置、上下文配置、字符过滤器配置及多种控制器配置方式,如参数映射、文件名映射、简单类型等。

 Spring MVC 环境的配置

1、创建一个动态web工程

2、加入所需的spring包、和日志包、还有servlet包等。

配置:
-----------------------------------web.xml中-----------------------------------------
3、配置转发控制器:org.springframework.web.servlet.DispatcherServlet
如: <!-- 配置DispatcherServlet -->
 <servlet>
  <servlet-name>jayo</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>2</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>jayo</servlet-name>
  <url-pattern>*.html</url-pattern>
 </servlet-mapping>
 
 使得后缀为.html的请求都能拦截,得到控制
 从而这样设置,外部就不知道是用什么技术写出来的了
 外面看到的都是.html,而它通过视图解析器对应到的
 却是其他类型的文本。
        这里应该只有拦截,起到一个过滤的作用,并没有。。。。。


4、配置容器,上下文
如: <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/jayo-servlet.xml</param-value>
 </context-param>
在启动时能把/jayo-servlet.xml中的配置文件加载到上下文中,也可以有多个
这样的文件,其中用逗号隔开,文件名为任意的。

 

5、如果有必要,配置一个字符过滤器:
 <!-- =======配置字符过滤器======= -->
 <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>  
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value> 设置转换为的编码
  </init-param>
  <init-param>
   <param-name>forceEncoding</param-name>
   <param-value>true</param-value>  强制转换
  </init-param>
 </filter>
 
 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>  过滤所有的请求
 </filter-mapping>

 


6、--------------------------------jayo-servlet.xml---------------------------------------------------
jayo-servlet.xml为上下文配置的文件,这里面就是所有的Spring
的控制器和视图等bean的配置了。
其中包括如下的几种类型配置:

1)、参数映射控制器----------------------------------------------------------------
 <!-- 参数映射控制器 -->
 <bean name="/test.html"
   class="org.springframework.web.servlet.mvc.ParameterizableViewController">
  <property name="viewName" value="test" />
 </bean>
=此控制器不用创建一个Controller,只要访问到这个bean就会转向test.jsp
当然这种就不需要访问模型的情况下,没有模型就没有必要去创建


2)、文件名映射控制器------------------------------------------------------------------ 
 <!-- 文件名映射控制器 UrlFilenameViewController测试 ======== -->
 <bean id="urlMapping"
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="welcome.html">forwardController</prop> <!-- 调用文件名映射控制器 -->
    <prop key="/help.html">forwardController</prop>
    <prop key="/admin/manage.html">forwardController</prop>
    
   </props>
  </property>
 </bean>
 <bean id="forwardController"
   class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
 </bean>

文件名控制器主要根据请求映射到相应的文件名,如在地址栏中访问welcome.html不用创建Controller
就会自动映射到welcome.jsp。而且几个请求都可以用一个控制器,相对于 “参数映射控制器” 要优化很多

 
3)、 简单类型控制器----------------------------------------------------------------
 <!-- ===============简单类型控制器AbstractController========================= -->
 <bean id="listArticles" class="com.qude.controller.ListArticleController">
 </bean>

简单类型控制器适合无参数或少量参数的传递访问 如:显示所有的帖子等
其中要重写
protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response)
方法,以便加载相关的数据。


3、2)命令控制器-----------------------------------------------------------------
 <!--------------------------------AbstractCommandController----------- -->
 <bean id="getLoveArticle" class="com.qude.controller.GetLoveAtcleController">
 </bean>

此控制器比 简单类型控制器 更适合少量参数传递的访问  如:显示我喜欢的帖子
一、在结构函数中可以用 setCommandClass(Article.class);方法设置command的对象类型
二、重写initBinder(HttpServletRequest request,ServletRequestDataBinder binder)方法
    绑定一些数据格式
三、重写
 protected ModelAndView handle(HttpServletRequest request,
  HttpServletResponse response, Object command, BindException errors)
 方法,来处理数据,控制转向。


4)、表单控制器----------------------------------------------------------------

 <!-- =============表单控制器SimpleFormController============== -->
 <bean name="registController"
   class="com.qude.controller.RegistController">
  <property name="formView" value="regist" />
  <property name="successView" value="welcome" />
 </bean>

 表单控制器主要是针对表单的,其中formView对应regist.jsp提交的数据,表单
 的action可以不用填写,successView就是成功后转向welcome视图。
 主要覆盖的方法为protected ModelAndView onSubmit(Object command, BindException errors)

 
------------------------------------------------------------------------------ 
5)、 <!-- ======向导控制器:AbstractWizardFormController分步注册===== -->
 <bean name="/stepRegist.html"
   class="com.qude.controller.StepRegistController">
  <property name="commandClass" value="com.qude.bean.User" />
  <property name="pages" value="regist0,regist1,regist2" />
  <property name="cancelView" value="help" />
  <property name="successView" value="welcome" />
 </bean>
 这控制器用的最多的为,分步注册。
 commandClass设置command的类型为User。
 pages顺序设置用到的页面。
 cancelView为取消对应的视图help
 successView为finish对应的视图welcome

 这里jsp页面也有需要注意的地方:
 上一步中的name值是特定的,如:_target1,表示第2个页面,第一个页面应该为_target0,依次类推
 <input type="submit" name="_target1" value="下一步"> 
 取消和提交也是特定的:
 <input type="submit" name="_cancel" value="取消"/>
 <input type="submit" name="_finish" value="确定" />
 从中,可以看出,不管是取消还是确定,type都是submit。

 除了在构造函数中设置command对象类型外,还要重写两个重要的方法:
 protected ModelAndView processFinish(HttpServletRequest request,
   HttpServletResponse response, Object command, BindException errors)
   throws Exception {
  User user = (User) command;
System.out.println("regist success");
  return new ModelAndView(this.getSuccessView(),"user",user);
 } 
 @Override
 protected ModelAndView processCancel(HttpServletRequest request,
   HttpServletResponse response, Object command, BindException errors)
   throws Exception {
System.out.println("regist fail");  
  return new ModelAndView(this.getCancelView());
 }


--------------------------------------------------------------------- 
6)、 <!-- ==========多动作控制器=========== -->
 <bean name="/usermanage.html"
   class="com.qude.controller.UserController">
  <property name="methodNameResolver" ref="methodNameResoler" />
 </bean>
 
 一个Controller完成多种类型的请求,如显示,查找、删除都容到一个Controller中。
 但涉及到一个方法名的解析问题,下面有这样的bean。
 methodNameResoler为方法解析属性

public class UserController extends MultiActionController { 
 public ModelAndView showUser(HttpServletRequest request,HttpServletResponse response) throws ServletRequestBindingException
  {
  String username = ServletRequestUtils.getStringParameter(request,"username");
//对数据进行操作
System.out.println("显示所有名为" + username + "的用户");
  return new ModelAndView("showuser");
 }
 
 public ModelAndView deleteUser(HttpServletRequest request,HttpServletResponse response) throws ServletRequestBindingException {
  String username = ServletRequestUtils.getStringParameter(request,"username");
  //对数据进行操作
  System.out.println("删除名为" + username + "的用户");
    return new ModelAndView("success");
 } 
}


------------------------------------------------------------------------
7)、 <!-- =============方法名解析============== -->
 <bean id="methodNameResoler"
   class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  <property name="paramName" value="method" />
 </bean>
 
 这就是一个方法名解析器,它能根据传入的方法名找到相应的方法处理
 如上面的访问地址为:http://localhost:8080/工程名/manageuser.html?method=deleteUser&username=jayo
 就会根据method=deleteUser找到delete方法

 

8)、 <!-- ==================Url映射调用bean================== -->
 <bean name="ja"
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/listarticles.html">listArticles</prop>
    <prop key="/getloveatl.html">getLoveArticle</prop>
    <prop key="/regist.html">registController</prop>
    <prop key="/registstep.html">/stepRegist.html</prop>
    <prop key="/test.html">/test.html</prop>
    <prop key="/usermanage.html">/usermanage.html</prop>
   </props>
  </property> 
 </bean>
 
 这个Mapping,主要根据请求的地址找到相应的控制器bean之类的来处理
 如:/listarticles.html,就会找到名为listArticles的bean控制器来处理请求

 前面说错了,应该是这里配置为.html为后缀才能隐藏技术


---------------------------------------------------------------------------------------------
9)、 <!-- ======================视图配置 如:test 被映射为:/web-inf/jsp/test.jsp========================== -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix">
   <value>/WEB-INF/jsp/</value>
  </property>
  <property name="suffix">
   <value>.jsp</value>
  </property>
 </bean>

 这是一个视图解析器,对于传入的视图,就会得到相应的解析,如:
 传入的为test。也就是ModelAndView("test"),通过这个解析器后,
 test就会加上前缀和后缀成为/WEB-Inf/jsp/test.jsp,这是一个
 真实的视图了

------------------------------------------------------------------------------------------

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值