由于工作原因一直在接触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>
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的前置后置
<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封装的彻底,使用变便捷。