【spring】spring MVC入门
spring mvc框架是一个web服务端开发框架
基于spring mvc框架进行开发,能够让我们脱离对底层代码实现的开发
让我们更加的专注于业务逻辑代码的开发,大大提高web服务开发的效率
spring mvc总体上分为三块:
controller模块:这个模块主要是获取用户请求,进行判断处理,然后返回数据
model模块:业务逻辑模块,包括业务数据的存储等操作和业务逻辑的操作
view模块:视图模块,主要是完成页面设计
interceptor模块:拦截器模块,这个模块可以进行对请求与响应的简单处理
DispatcherServlet
用户发送url请求,都会由 dispatcherServlet 进行处理,由它来进行选择相对应的 controller 进行处理
在servlet-mapping 中定义了,所有的.do结尾的请求均会由 dispatcherServlet 处理
// 配置文件 web.xml
<servlet>
<servlet-name >dispatcherServlet</ servlet-name>
<servlet-class >
org.springframework.web.servlet.DispatcherServlet
</servlet-class >
<init-param >
<param-name> contextConfigLocation</param-name >
<param-value> /WEB-INF/mymvc.xml</param-value >
</init-param >
<load-on-startup >1</ load-on-startup>
</servlet >
<servlet-mapping >
<servlet-name >dispatcherServlet</ servlet-name>
<url-pattern >*.do</ url-pattern>
</servlet-mapping >
在spring mvc中,需要实现 controller 接口,因为 DispatcherServlet 会选择合适的controller来进行请求的处理
controller 接收到请求后,会调用handleRequest 方法进行处理,因此,我们需要实现该方法
public class HelloController implements Controller{
private String view;
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1)
throws Exception {
String hi = arg0.getParameter("test");
// 返回一个 ModelAndView 对象,该对象包含了view页面路径信息和model数据等
// 这个 ModelAndView 对象的解析将会由 spring mvc 中viewResolver进行解析处理
return new ModelAndView(view, "test" , hi);
}
public void setView(String view) {
this.view = view;
}
}
要实现web服务,则还需要在
mymvc.xml 配置文件中定义好需要使用的bean
spring mvc 有相关的视图解析类
例子中用的解析类为viewResolver ,其对应是spring的
InternalResourceViewResolver 类
解析结果为:是在
/views/
目录下的后缀名为
.jsp
的jsp文件
解析完成后会由
InternalResourceViewResolver
进行页面的渲染
<bean id= "viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/views/"></ property>
<property name="suffix" value=".jsp"></ property>
</bean>
<!-- 拦截器,能够在controller等执行前后进行一些操作
本例中,主要是在controller执行前后进行日志的打印 -->
<bean id= "loggingInterceptor"
class="com.ming.sns.spring.LoggingInterceptor" >
</bean>
<!-- dispatcherServlet是根据handlerMapping实例进行判断选择合适的controller
本例中使用的 handlerMapping对象为spring中的ControllerClassNameHandlerMapping类
该类的使用需要controller类的定义符合命名规范,如hello*的请求会寻找helloController进行处理 -->
<bean id= "controllerClassNameHandlerMapping"
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
<!-- 在handlerMapping中引用拦截器,则实现拦截处理的功能 -->
<property name="interceptors" >
<list>
<ref bean="loggingInterceptor" />
</list>
</property>
</bean>
<!-- 定义controller处理bean -->
<bean name="helloController"
class="com.ming.sns.spring.HelloController" >
<property name="view" value="hello"></ property>
</bean>
// 拦截器的实现类
public class LoggingInterceptor extends HandlerInterceptorAdapter{
private Logger logger = Logger.getLogger( this.getClass().getName());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
// TODO Auto-generated method stub
logger.info(handler.getClass().getName() + " job start...");
return true ;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
logger.info(handler.getClass().getName() + " job over...");
//super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
// TODO Auto-generated method stub
logger.info(handler.getClass().getName() + " view render over...");
//super.afterCompletion(request, response, handler, ex);
}
}
http://localhost:8080/myspring/hello.do?test=helloworld
输入地址后页面会显示 helloworld
控制台会输出
2012-10-06 14:44:31,087 INFO [com.ming.sns.spring.LoggingInterceptor] - com.ming.sns.spring.HelloController job start...
2012-10-06 14:44:31,087 INFO [com.ming.sns.spring.LoggingInterceptor] - com.ming.sns.spring.HelloController job over...
2012-10-06 14:44:31,087 INFO [com.ming.sns.spring.LoggingInterceptor] - com.ming.sns.spring.HelloController view render over...