class中的class viewcontrollerr可省略吗

JFinal2.2初体验之Controller学习(三) - 简书
JFinal2.2初体验之Controller学习(三)
1.储备知识
jfinal框架采用了传统的MVC架构设计,来不及解释了,快上车。jfinal的Controller是线程安全的,所谓的线程安全就是在多线程访问时,采用了加锁机制来保护数据。这样的做的好处是不会出现脏数据。
2.开始旅程
Controller中,最好保证它的纯洁性,不要写复杂的的业务逻辑代码。当然你要是喜欢的话,那就把一大堆的业务代码写在Controller中,反正维护你代码的人会一直问候你的。Controller 其实主要负责action请求的分发和返回就好。
2.1 写行代码(醒醒脑)
在工程中新建html类型的文件,命名login.html,代码如下:
&!DOCTYPE html&
&meta charset="UTF-8"&
&title&登录页面&/title&
&form action="/sinlogin/login"&
&label&账号:&/label&&input type="text" name="user.name"& &br /&&br /&
&label&密码:&/label&&input type="text" name="user.pwd"&&br /&&br /&
&button type="submit"&登录&/button&
页面中有两个input和一个button配合工作。从代码中可以看出一些细节,比如action的指向,比如表单元素的name。
2.2剧情回顾(configRoute配置)
* 配置路由
public void configRoute(Routes me) {
//第一个参数是访问controller的key
//第二个参数是要映射的controller
// 第三个参数为该Controller的视图存放路径
// 第三个参数省略时默认与第一个参数值相同,在此即为 "/sinlogin"路径
me.add("/sinlogin",LoginController.class);
2.3主角登场(Controller)
public class LoginController extends Controller{
*固定写法,配置默认的根路由
public void index(){
render("login.html");
*login方法
public void login(){
String name = getPara("user.name");
//获取用户名
String pwd = getPara("user.pwd");
//获取用户密码
//输出页面上提交的信息,不出意外信息输出正常
System.out.println("该用户的用户名是:"+name+",密码是:"+pwd);
2.4成双成对(数据展示)
我们已经学会了提交数据到后台,那如果想从后台获取数据展示在页面上该怎么办么?别急,车子还没停下来,我们一起开。滴滴滴滴
public void index(){
//定义变量并赋值初始化
String name = "yetangtang";
String pwd = "123456";
//利用setAttr 方法将数据传递给view(视图)
setAttr("name",name);
setAttr("pwd",pwd);
//渲染页面
render("login.html");
接下来修改html页面的代码,具体如下:
&!DOCTYPE html&
&meta charset="UTF-8"&
&title&登录页面&/title&
&form action="/sinlogin/login"&
&label&账号:&/label&&input type="text" name="user.name" value="${name!}"& &br /&&br /&
&label&密码:&/label&&input type="text" name="user.pwd" value="${pwd!}"&&br /&&br /&
&button type="submit"&登录&/button&
好厉害,你已经成功get新技能了。大神,请收下我的膝盖~
3.更多方法预览
getPara 系列方法 :获取页面传递参数;
getModel 与 getBean 系列方法 :获取model(实体);
setAttr 方法 :展示数据到view;
getFile 系列方法:处理文件上传;
renderFile 方法:处理文件下载 ;
render 系列方法 :渲染视图并返回客户端;
session 操作方法 :处理session对象存储与管理。
PS:愿小伙伴们学习进步,有坑大家一起填。
自古深情留不住,总是套路得人心。
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
Java 基础思维导图,让 Java 不再难懂 - 工具资源 - 掘金思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具。了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板。 思维导图...
1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个&.java&源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个publ...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗offer。我找的是java后台开发,把常见的问题分享给大家,有一些是自己的总结,有一些是网上借鉴的内容。希望能帮助到各位。预祝各位同学拿到自己心仪的offer...
雨从檐角下落,风在窗外穿行,山朦胧,水朦胧,树朦胧,人朦胧,一切,空朦迷离,如梦似幻。独倚轩窗,听风,听雨,时光,就这样漫过心田。夏天的雨,说来就来,说走就走。它,凝聚在草尖,泼洒在石上,像一首寂静的诗,像一支优雅的歌。
年,我住在英国的时候,曾经在当地华侨开办的中文学校里担任中文老师,接触了当地的BBC(英国土生土长的华裔),深切的感受到了中西方文化的巨大差异。 那时我的学生总共不过5名,都是13~15岁之间的少男少女,别看他们长的和普通的中国少年没什么两样,一般的黑眼睛...
The Dark Side Of The Moon月缺 月亮有圆有缺,月亮的背面却是人们最感兴趣的。 人云:天有不测风云,人有旦夕祸福。福兮祸之所倚,祸兮福之所伏。 我知道我有倒霉的一天,却盼它快来。因为我想看清每个人的相貌:是猪,是狗,是猪狗不如,或是人。 他曾经走来,取...
“十年寒窗,十年苦干,再加上十足十的运气,才能有一份事业。你别把事情看得太容易,大多数人只能有一份职业,借之糊口,辛劳一生。有多少人敢说自己的工作是事业?” 阿狸在本子上写下亦舒的这句话。这句话记得太过真切,倒是像背下来了一样,不由自主地流泻于笔尖。 多么痛的领悟! 也就是...
对着一道英语填空题 英语填空题 填空题 空题 冥思苦想 冥思苦想 冥思苦想 横线空着 我也空着 哼 都一样空着 非要 彼此为难 互相厮杀 意义何在 冥思苦想 冥思苦想 冥思苦想 横线还空着 我也还空着 哼 都一样还空着 非要 彼此为难 互相厮杀 画一个圆 死循环 结束Controller
本文所属图书&>&
针对最新版本的ASP.NET MVC 4,深入剖析底层框架从请求接收到响应回复的整个处理流程(包括URL路由、Controller的激活、Model元数据的解析、Model的绑定、Model的验证、Action的执行、View的呈现和ASP.NET We...&&
我们知道作为Controller的类型直接或者间接实现了System.Web.M.IController接口。如下面的代码片段所示,IController接口仅仅包含一个参数类型为RequestContext的Execute方法,当一个Controller对象被激活之后,其核心的操作就是:从包含在当前请求上下文的路由数据中获取Action名称并据此解析出对应的方法,将通过Model绑定机制从当前请求上下文中提取相应的数据并调用Action方法生成对应的参数列表。所有这些后续操作都是间接地通过调用Controller的Execute方法来完成的。
public interface IController
&&& void Execute(RequestContext requestContext);
定义在IController接口中的Execute是以同步的方式执行的。为了支持以异步方式对请求的处理,IController接口的异步版本System.Web.M.IAsyncController被定义出来。如下面的代码片段所示,实现了IAsyncController接口Controller的执行通过BeginExecute/EndExecute方法以异步的形式完成。
public interface IAsyncController : IController
&&& IAsyncResult BeginExecute(RequestContext requestContext,
&&&&&&& AsyncCallback callback, object state);
&&& void EndExecute(IAsyncResult asyncResult);
抽象类System.Web.Mvc.ControllerBase实现了IController接口。如下面的代码片段所示,ControllerBase以&显式接口实现&的方式定义了Execute方法,该方法在内部直接调用受保护的Execute虚方法,而后者最终会调用抽象方法ExecuteCore方法。
public abstract class ControllerBase : IController
&&& //其他成员
&&& protected virtual void Execute(RequestContext requestContext);
&&& protected abstract void ExecuteCore();
&&& void IController.Execute(RequestContext requestContext);
&&& public ControllerContext &&ControllerContext { }
&&& public TempDataDictionary && &TempData { }
&&& public object &&&& &ViewBag { [return: Dynamic] }
&&& public ViewDataDictionary && &ViewData { }
ControllerBase具有如下几个重要的属性:TempData、ViewBag和ViewData,它们用于存储从Controller向View传递的数据或者变量。其中TempData和ViewData具有基于字典的数据结构,Key和Value分别表示变量的名称和值,两者的不同之处在于前者仅仅用于存储临时数据,并且设置的变量被第一次读取之后会被移除,换句话说通过TempData设置的变量只能被读取一次。ViewBag和ViewData共享着相同的数据,它们之间的不同之处在于前者是一个动态对象,我们可以为其指定任意属性(动态属性名将作为数据字典的Key)。
在ASP.NET MVC中我们会陆续遇到一系列的上下文(Context)对象,之前已经对表示请求上下文的RequestContext(HttpContext + RouteData)进行了详细的介绍,现在来介绍另一个具有如下定义的上下文类型System.Web.Mvc.ControllerContext。
public class ControllerContext
&&& //其他成员
&&& public ControllerContext();
&&& public ControllerContext(RequestContext requestContext,
&&&&&&& ControllerBase controller);
&&& public ControllerContext(HttpContextBase httpContext,
&&&&&&& RouteData routeData, ControllerBase controller);
&&& public virtual ControllerBase &&Controller { }
&&& public &RequestContext &&&RequestContext { }
&&& public virtual HttpContextBase &HttpContext { }
&&& public virtual RouteData &&&RouteData { }
顾名思义,ControllerContext就是基于某个Controller对象的上下文。从如上的代码可以看出一个ControllerContext对象实际上是对一个Controller对象和RequestContext的封装。这两个对象分别对应着ControllerContext中的同名属性,可以在构建ControllerContext的时候为调用的构造函数指定相应的参数来初始化它们。
通过HttpContext和RouteData属性返回的HttpContextBase和RouteData对象在默认情况下实际上就是RequestContext的核心组成部分。当ControllerBase的Execute方法被执行的时候,它会根据传入的ReuqestContext创建ControllerContext对象,后续的操作可以看成是在该上下文中进行。
通过Visual Studio的Controller创建向导创建的Controller类型实际上继承自抽象类System.Web.Mvc.Controller,它是ControllerBase的子类。如下面的代码片段所示,除了直接继承ControllerBase之外,Controller类型还显式地实现了IController和IAsyncController接口,以及代表ASP.NET MVC 四大筛选器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter)的4个接口(我们会在第7章&Action的执行&中对筛选器进行详细介绍)。
public abstract class Controller :
&&& ControllerBase,&&&&&
&&& IController,
&&& IAsyncController,
&&& IActionFilter,
&&& IAuthorizationFilter,
&&& IExceptionFilter,
&&& IResultFilter,&
&&& IDisposable,
&& //省略成员
同步还是异步
从抽象类Controller的定义可以看出它同时实现了IController和IasyncController这两个接口,意味着它既可以采用同步的方式(调用Execute方法)执行,也可以采用异步的方式(调用BeginExecute/EndExecute方法)执行。但是即使执行BeginExecute/EndExecute方法,Controller也不一定是以异步方式执行的。
如下面的代码片段所示,Controller具有一个布尔类型的属性DisableAsyncSupport,表示是否关闭对异步执行的支持。在默认的情况下该属性总是返回False,即支持以异步方式执行Controller。BeginExecute方法会根据DisableAsyncSupport属性决定究竟是调用Execute方法以同步的方式执行,还是调用BeginExecuteCore/EndExecuteCore方法以异步的方式执行。换句话说,如果我们希望Controller总是以同步的方式来执行,可以将DisableAsyncSupport属性设置为True。
public abstract class Controller: ...
&&& //其他成员
&&& protected virtual bool DisableAsyncSupport
&&&&&&& get{}
&&& protected virtual IAsyncResult BeginExecute(RequestContext requestContext,
&&&&&&& AsyncCallback callback, object state)
&&&&&&& if (this.DisableAsyncSupport)
&&&&&&&&&&& //通过调用Execute方法同步执行Controller
&&&&&&& else
&&&&&&&&&&& //通过调用BeginExecuteCore/EndExecuteCore方法异步执行Controller
&&& protected virtual IAsyncResult BeginExecuteCore(AsyncCallback callback,
&&&&&&& object state);
&&& protected virtual void EndExecuteCore(IAsyncResult asyncResult);
现在我们通过一个简单的实例来演示属性DisableAsyncSupport对默认创建的Controller执行的影响。我们在一个ASP.NET MVC应用中定义了一个具有如下定义的默认Home Controller,它重写了Execute、ExecuteCore、BeginExecute/EndExecute和BeginExecuteCore/ EndExecuteCore六个方法,同时将相应的方法名写入响应并最终呈现在上。
public class HomeController : Controller
&&& public new HttpResponse Response
&&&&&&& get { return System.Web.HttpContext.Current.R }
&&& protected override void Execute(RequestContext requestContext)
&&&&&&& Response.Write(&Execute(); &br/&&);
&&&&&&& base.Execute(requestContext);
&&& protected override void ExecuteCore()
&&&&&&& Response.Write(&ExecuteCore(); &br/&&);
&&&&&&& base.ExecuteCore();
&&& protected override IAsyncResult BeginExecute(RequestContext requestContext,
&&&&&&& AsyncCallback callback, object state)
&&&&&&& Response.Write(&BeginExecute(); &br/&&);
&&&&&&& return base.BeginExecute(requestContext, callback, state);
&&& protected override void EndExecute(IAsyncResult asyncResult)
&&&&&&& Response.Write(&EndExecute(); &br/&&);
&&&&&&& base.EndExecute(asyncResult);
&&& protected override IAsyncResult BeginExecuteCore(AsyncCallback callback,
&&&&&&& object state)
&&&&&&& Response.Write(&BeginExecuteCore(); &br/&&);
&&&&&&& return base.BeginExecuteCore(callback, state);
&&& protected override void EndExecuteCore(IAsyncResult asyncResult)
&&&&&&& Response.Write(&EndExecuteCore(); &br/&&);
&&&&&&& base.EndExecuteCore(asyncResult);
&&& public ActionResult Index()
&&&&&&& return Content(&Index();&br/&&);
虽然抽象类中定义了一个表示当前HttpResponse的属性Response,但是当BeginExecute方法执行的时候该属性尚未初始化,所以上面代码中使用的Response属性是我们自行定义的。运行该程序后会在中呈现出如图3-1所示的输出结果。从输出方法的调用顺序中不难看出在默认的情况下Controller是以异步的方式执行的。(S301)
现在按照如下的方式重写虚属性DisableAsyncSupport,使它直接返回True以关闭对Controller异步执行的支持。
public class HomeController : Controller
&&& //其他成员
&&& protected override bool DisableAsyncSupport
&&&&&&& get{}
再次执行我们的程序将会得到如图3-2所示的输出结果,可以看出由于HomeController间接地实现了IAsyncController接口,Controller的执行总是以调用BeginExecute/EndExecute方法的方式来执行,但是由于DisableAsyncSupport属性被设置为True,BeginExecute方法内部会以同步的方式调用Execute/ExecuteCore方法。(S302)
ASP.NET MVC应用接口中还定义了一个System.Web.Mvc.AsyncController类型,从名称上看,AsyncController是一个基于异步的Controller,但是这里的异步并不是指Controller的异步执行,而是Action方法的异步执行。从如下的代码片段中可以看出,这个直接继承自抽象类Controller的AsyncController是一个&空&类型(没有额外定义和重写基类的类型成员)。在上一个版本中,以XxxAsync/XxxCompleted形式定义的异步Action方法均定义在继承自AsyncController的Controller类型中,考虑到向后兼容性,AsyncController在新的版本中保留下来。
public abstract class AsyncController : Controller
只有以传统方式(XxxAsync/XxxCompleted)定义的异步Action方法才需要定义在AsyncController中。ASP.NET MVC 4.0提供了新的异步Action方法定义方式,使我们可以通过一个返回类型为Task的方法来定义以异步方式执行的Action,这样的Action方法不需要定义在AsyncController中。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
文章下载读书整合spring+mybatis 报错以下错误:我完全是IDEA的问题!!!找了半天啊!!!org.apache.ibatis.binding.BindingException: Invalid bo...
大家好,我是水牛君,最近同事做的项目需要做一个功能,就是把一张表的某个字段数据查询出来导入另外一张表。这里有两种做法。
第一种,那就是很传统的,通...
/lane_cn/archive//672628.html
Model-View-Controller简称为MVC,这是图形...
前端控制器模式
前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者...
当在一个程序中需要许多的算法时,那么最好将它们集中起来好控制。那么这时候就需要一个集中的控制器,以便于集中管理这些类。这就是管理器。在应用中起着一个重要的作用。
下面就让我们利用上一...
Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用。基于MVC设计模式,Cocoa整体架构可以划分为...
在学习SOPC的过程中遇到了两个问题,一直找不到好的资料,看了Nios
II 嵌入式系统硬件设计(二)中有关flash 那几个时间参数的设计觉得挺不错的,就索性连Nios II 嵌入式系统硬件设计...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
业务场景:目前在开发一个web后端的程序,提供基于spring mvc的restful的接口给手机端调用。由于接口对性能和效率的要求比较高,为了更好的分析问题,这边决定输出日志对接口调用情况,以及频率,做记录。这边考虑基于spring的aop来实现日志切面编程,下面看代码:切面类
public class CxxxAspect {
* 定义一个切入点
@Pointcut("execution(* com..controller.*Controller.*Auth(..))")
private void pointCutMethod() {
声明前置通知
@Before("pointCutMethod()")
public void doBefore() {
System.out.println("前置通知");
声明后置通知
* @param result
@AfterReturning(pointcut = "pointCutMethod()", returning = "result")
public void doAfterReturning(String result) {
System.out.println("后置通知");
System.out.println("---" + result + "---");
声明例外通知
@AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")
public void doAfterThrowing(Exception e) {
System.out.println("例外通知");
System.out.println(e.getMessage());
声明最终通知
@After("pointCutMethod()")
public void doAfter() {
System.out.println("最终通知");
声明环绕通知
* @param pjp
* @throws Throwable
@Around("pointCutMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入方法---环绕通知");
Object o = pjp.proceed();
System.out.println("退出方法---环绕通知");
@Controller
@RequestMapping(value="xxxx")
@SuppressWarnings({ "rawtypes", "unchecked" })
public class CXXXController{
@ResponseBody
@RequestMapping(value="/xxxx",method=RequestMethod.POST)
public void xxxAuth(HttpServletRequest request){
//省略实际业务代码
配置文件信息(保护个人隐私类名全路径以xxxx代替)
&aop:aspectj-autoproxy proxy-target-class="true"/&
&bean id="caFaceAuthAspect" class="com.xxxxx.aspect.CxxxAspect"/&
通过main方法测试代码:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
context.start();
CAAuthController con=(CXXXController)context.getBean(CXXXController.class);
con.xxxAuth(null, null);
日志输出:
进入方法---环绕通知
证明当前配置已经ok,测试效果达到预期。但是用tomcat启动时,通过http访问到controll时,并没有进入切面类,更别说通知方法了,请问这是什么情况。我有一个模糊的假设就是,我在main方法里面是手动实实在在的用controll类去调用了方法,所以触发了通知的连接点条件,但是http访问时,通过spring的mvc分发,反射调用所以并没有触发连接点的条件。不知道我的假设是否正确,或者有相关的大神还请不吝赐教。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
好了,经过各大论坛发帖,各大技术群求大神,终于找到了问题的原因:1.是父子容器的问题2.我的切面代码和连接点,通知都没有问题,问题出在了我的配置信息上面。3.我将配置信息如下:
&aop:aspectj-autoproxy proxy-target-class="true"/&
&bean id="caFaceAuthAspect" class="com..aspect.CxxxAuthAspect"/&
将其配置在了spring-context.xml 核心配置文件中,该配置文件会被ContextLoaderListenerclass加在,Spring会创建一个WebApplicationContext上下文,称为父上下文(父容器) ,保存在 ServletContext中,keyWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值。
而spring-mvc.xml是DispatcherServlet,可以同时配置多个,每个 DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器),子上下文可以访问父上下文中的内容,但父上下文不能访问子上下文中的内容。 它也保存在 ServletContext中,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名称
当spring加在父容器的时候就会去找切入点,但是这个时候切入的controller是在子容器中的,父容器是无法访问子容器,所以就拦截不到。如果将上述的配置文件放到spring-mvc.xml中,那么问题就解决了。我已经测试通过啦。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
right 同样的问题解决了 谢谢。
该答案已被忽略,原因:
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
找了好久答案,原来在这里,赞
该答案已被忽略,原因:
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。这个类的声明有什么错_百度知道
这个类的声明有什么错
protected class Fred{private int x = 0;private Fred (int xval){
x=}}谁解释一下
怎么个错法
我有更好的答案
llegal modifier for the class F only public, abstract & final are permitted也就是说,类的修饰符只能是public(公共类)。其他诸如private,final(不可继承类),或者省略,abstract(抽象类),此时的类只能在同个包内可见,即无修饰符
采纳率:42%
二楼说的就是错误所在,一个类不能用protected来修饰,另外,private Fred(int xval){}这个方法就像一楼说的那样,跟构造方法同名,但是又不是构造方法,说是重载也不对,就这样
两个类名相同,但属性又不一样,说是重载也不对。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 controller中的方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信