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,这是一个
真实的视图了
------------------------------------------------------------------------------------------
本文介绍SpringMVC环境配置步骤,包括动态web工程搭建、依赖包引入、DispatcherServlet配置、上下文配置、字符过滤器配置及多种控制器配置方式,如参数映射、文件名映射、简单类型等。

被折叠的 条评论
为什么被折叠?



