【兄弟连 】Spring Mvc3 和 C# MVC3

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



你可能感兴趣的:(spring,mvc,框架,C#)