由于工作原因一直在接触java和C#的web开发,用到框架中比较典型的就算是Spring Mvc3和MVC3
下面个人用代码段的方式对比一下两个框架的同异。以下:S代表springmvc3 C代表C# MVC3
1、配置文件:
C:
Global.asax【路由配置】
Web.config【web配置如:web的引用等】
controller【必须继承Controller】
S:
web.xml、servletname-serlvet.xml、ContextLoaderListener.xml【web以及mvc的基本配置】
controller【3.0一般都采用注解的方式 @Controller】
2、controller的映射
C:
通过路由的方式:
routes.MapRoute(
"Default", // Route name 路由名称
"{action}/{id}", // URL with parameters 可以匹配如:user/login/10086
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 默认配置
);
routes.MapRoute("Demo", "Demo/{action}", new { controller = "Demo", action = "Index" });
S:
通过注解的方式:
@Controller
@RequestMapping(value="/user")
public class Demo_2_Controller {
/**
* 此action路由为http://localhost:8080/SpringMvcDemo_2/user/login/{username}
* @param username
* @return
*/
@RequestMapping(value="/login/{username}")
//@RequestMapping(value="/login/{userId}/create"):这样也是可以的,请求的URL可以是“/user/login/{username}/create”。
public ModelAndView Login(@PathVariable String username)
{
ModelAndView mav = new ModelAndView("user/loginsuccess");
mav.addObject("username", username);
return mav;
}
}
spring mvc的方式更为丰富,也更为自由
3、常用的声明和注解
//支持post或者get方法
C: 默认是支持get和post
<span style="white-space:pre"> </span>HttpPost]
[HttpGet]
public ActionResult PayType()
{
return PartialView("PayType");
}
S:默认是支持get和post
@RequestMapping(value = "/JsonData", method = {RequestMethod.POST,RequestMethod.GET},headers="Content-Type=application/json")
//面向切面
C:继承controller,需要重写其OnActionExecuting OnActionExecuted
S:有两种方式
①一个是过滤器filter的方式:
<bean id="loginCheck" class="vancl.com.filter.LoginInitInterceptor"></bean>
<!--Spring3.1开始的注解 HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<ref bean="loginCheck"/>
</list>
</property>
</bean>
其中loginCheck为自定义过滤器,需要继承HandlerInterceptorAdapter,重写其三个方法:
package vancl.com.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* 登陆检测
*
* @author yangfenge
*
*/
public class LoginCheckIntercepter extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO 可以做一些session和cookies的更新
request.getSession().setAttribute("username", "upxiaofeng");
request.getSession().setAttribute("password", "upxiaofeng");
request.getSession().setAttribute("userid", "10086");
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
boolean flag = false;
// 获取用户session 判断用户是否存在
String userid = (String) request.getSession().getAttribute("userid");
String username = (String) request.getSession()
.getAttribute("username");
String password = (String) request.getSession()
.getAttribute("password");
// 存在用户判断一级登陆
if (username != null && username != "" && password != null
&& password != "") {
if (userid != null && userid != "") {
// TODO 验证用户通过
flag=true;
}else {
// TODO 用户一级登陆,跳转到登陆界面
response.sendRedirect("登陆url"+request.getRequestURI());
}
} else {
// TODO 用户未登录,跳转到登陆界面
response.sendRedirect("登陆url"+request.getRequestURI());
}
;
return flag;
}
}
②spring的前置后置
配置xml
<aop:aspectj-autoproxy />
<!-- 启用日志类 -->
<bean id="mylog" class="controller.log.MyLog"></bean>
<!-- AOP配置 proxy-target-class需要设置为true-->
<aop:config proxy-target-class="true">
<!-- expression 设置切入一个或者一组方法 -->
<aop:pointcut id="log" expression="execution(* vancl.*.*(..))" />
<!-- aspect 设置切面 -->
<aop:aspect id="myLog" ref="mylog">
<!-- before 方法执行之前通知,method:通知的方法 -->
<aop:before pointcut-ref="log" method="before"/>
<!-- after 方法执行之后通知,method:通知的方法 -->
<aop:after pointcut-ref="log" method="after"/>
</aop:aspect>
</aop:config>
mylog代码:
package controller.log;
import org.aspectj.lang.JoinPoint;
public class MyLog {
// 在类里面写方法,方法名诗可以任意的。此处我用标准的before和after来表示
// 此处的JoinPoint类可以获取,action所有的相关配置信息和request等内置对象。
public void before(JoinPoint joinpoint) {
// 此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
Object[] object = joinpoint.getArgs();
for(Object o:object){
System.out.println(o);
}
System.out.println(joinpoint.getClass().getMethods());
System.out.println(joinpoint.getTarget());
System.out.println("被拦截方法调用之前调用此方法,输出此语句");
}
public void after(JoinPoint joinpoint) {
System.out.println("被拦截方法调用之后调用此方法,输出此语句");
}
}
在执行vancl包里面的所有类的所有方法的时候会进入mylog中。
在这里仅仅是总结了两个框架之前比较重要和常用的相似之处,其中springmvc的action返回的内容包含 视图 Json 字符串等等,C# MVC中同样有这些返回类型。
总体来说都是两个比较好用的前台框架。个人觉得springmvc更为灵活,配置上略微麻烦,C#mvc封装的彻底,使用变便捷。