
public Object getBean(String beanName) { ServletContext servletContext = thisgetServlet()getServletConfig() getServletContext(); WebApplicationContext wac = WebApplicationContextUtils getRequiredWebApplicationContext(servle
为提高线上代码的质量,我们在项目持续集成的过程中,会对提交编译打包的代码进行静态代码扫描。我们预置了一些开发语言的语法规则(bug、漏洞、代码风格等),在静态代码扫描时,会对代码进行扫描,并将不符合规则的的代码标记出来。如果扫出的代码问题很严重,则会阻断上线,开发人员必须对问题代码进行修改。为方便对问题代码的修改,我们使用了静扫插件。该插件会在开发人员的编码过程中,对编写的代码进行扫描和分析,并将代码中与指定规则不符合的代码标记出来,提示开发人员修改。这样可以让开发人员快速发现问题,并及时修改。
但此时会面临一个问题,不同的业务线,对于代码的要求可能是不一样的,如何让这些规则匹配到所有的业务线。于是使用了规则集,把不同业务线的规则放到不同的规则集中,让业务线使用各自的规则集。为此我们开发了58EE插件,通过这个插件来修改规则集。
58EE插件有Eclipse和IDEA两个版本,并同时支持Mac OS和Windows。
下面我们就以IDEA为例,带大家了解下如何开发IDE插件。
1、配置JDK
点击File -> Project Structure,打开ProjectStructure面板。
在Project Structure面板中点击SDKs,之后点击加号,选择JDK。
选中JDK所在的路径,点击OK。
2、配置插件开发SDK
在Project Structure面板中点击SDKs,之后点击加号,选择IntelliJ Platform Plugin SDK。
选中IDEA的安装目录,点击OK。
3、启用Plugin DevKit插件
在Settings面板的Plugins中找到Plugin DevKit,确保此插件处于开启状态。一般IDEA中会自带此插件。
插件工程有两种形式,一种是DevKit,一种是Gradle。DevKit结构简单,上手快,Gradle依赖管理方便。官方推荐使用Gradle。对于插件开发选用哪种工程,一般根据插件的功能需求来确定。功能简单,依赖较少就用DevKit;功能复杂,依赖较多就用Gradle。
创建DevKit工程
在创建工程时选择IntelliJ Platform Plugin。
点击Next,填写工程名,点击Finish。
创建Gradle工程
在创建工程时选择Gradle,勾选Java和IntelliJPlatform Plugin。
点击Next,填写项目相关信息,建立项目。(注意Gradle工程需要在IDEA中配置Gradle)
pluginxml
在resources/META-INF目录下有个pluginxml文件,这是插件工程的配置文件。
以上内容是pluginxml中的基本配置内容,随着插件功能的增加,配置文件的内容也会越来越多。其它的配置项会在之后的功能开发模块介绍。
buildgradle
现在,我们开发一个插件小功能,在IDEA中新增一个按钮,点击该按钮d出一个Hello World的提示窗。
创建Action
在pluginxml中添加Action配置。
编写该Action的实现类。继承AnAction类,重写actionPerformed()方法。
运行调试
打开运行配置面板,点击加号,选择Plugin。
填写相关参数。VM Options为JVM参数,Use classpath of module为运行的插件项目,选择此次编写的插件,点击OK。
点击运行或调试按钮,则会启动一个新的IDEA,在此IDEA中会应用此插件工程。
开发者可以在新打开的这个IDEA中查看插件的使用效果。点击File,在最后一项出现HelloWorld。
点击HelloWorld,d出提示框。
DevKit打包
在菜单栏点击Build -> Prepare Plugin Module ‘xxx’ For Deployment,之后会在项目所在目录生成插件的zip压缩包。
Gradle打包
在Gradle窗口中点击双击clean,clean结束后双击build。
Build完成后,会在工程目录中生成build文件夹。
在build文件下的distributions目录中可以看到此插件打包后的文件。
插件安装方式
IDEA上的插件有两种安装方式:本地安装和在线安装。如果有插件的文件包,可以选择本地安装;如果你有插件的安装地址,就可以选择在线安装。
本地安装
本地安装有两种方式。一种是直接将插件zip文件解压后的文件夹放到IDEA安装目录的plugins目录中。
另一种方式是在IDEA中安装。在Setting面板的Plugins中点击Install plugin from disk。
选择本地的插件文件,点击OK。
在线安装
如果要安装官方插件仓库中的插件,则再插件面板中点击Browse repositories。
在d出的窗口中点击Repository单选框,选择插件所在的仓库。也可以在搜索框中输入插件的名称进行搜索。
找到插件后选中该插件,点击右方的Install进行安装。
注:安装完插件后,须重启IDEA才能使插件生效。
建立插件仓库
如果开发的是一个开源插件,想要全世界的人都可以使用这个插件,那么可以把这个插件发布到JetBrains的插件仓库。如果只想让这个插件在一定范围内使用,比如在公司内部使用,那么可以建立一个插件仓库。使用者通过访问这个插件仓库来安装插件。
创建一个任意名称的xml文件,在文件中写入以下内容。
其中,plugins标签中的每一项plugin代表一个插件。
id为插件工程配置文件pluginxml中定义的id;
url为该插件的下载地址;
version为插件的版本号,需要和pluginxml中的版本号对应;
如果插件要升级版本,则将url改为新版本插件的地址,version改为新的版本号。改完后使用者直接在IDEA上就可以升级。
写完这个xml文件后,把这个文件放到服务器上,文件的地址就是插件仓库的地址。在IDEA中添加自定义的插件仓库。在插件面板中点击Browse repositories。
点击下方的Manage repositories。
在d出的自定义插件仓库面板中,点击右方的加号。
输入xml文件的地址。
点击Check Now,如果d出成功的提示窗,则表示插件仓库能够被IDEA识别。
如果d出错误信息,则表示这个插件仓库检测失败,需重新检测仓库地址或xml文件编写是否有误。
在插件进行在线安装时,选择添加的自定义仓库,就可以看到这个仓库中的所有插件,选择需要的插件进行安装。
安装完插件后,如果该插件发布了新的版本,则Install按钮会变成Update按钮。用户点击该按钮就可以升级到新版本的插件。
插件组件是插件集成的基础概念。
插件组件的类型
插件有三种类型的组件,应用级组件(Application Component)、项目级组件(Project Component)、模块级组件(Module Component)。
应用级组件会在IDEA启动的时候创建和初始化,其生命周期伴随整个IDEA进程。在插件中只能有一个应用级组件。使用应用级组件,需在pluginxml中定义<application-components>标签,其实现类必须实现ApplicationComponent接口。在使用时可以通过ApplicationManager来获取Application实例,再通过Application实例的getComponent(Class)方法来获取应用级组件
在每个Project实例创建时,由IDEA自动为该实例创建一个项目级组件。在pluginxml中需使用<Project-components>标签定义,其实现类需要实现ProjectComponent接口,使用时通过Project实例的getComponent(Class)方法获取。
当Project中有Module被创建时,IDEA会自动为其创建一个模块级组件。在pluginxml中需使用<Project-components>标签定义,其实现类需要实现ModuleComponent接口,使用时通过Module实例的getComponent(Class)方法获取。
定义的每个组件,无论哪种类型,都有一个唯一的名字,用来作为外部,便于其它组件检索。通过组件的getComponentName()方法返回。组件的名字,推荐使用“插件名组件名”的方式来命名。
Component的周期方法
组件接口中有多个方法,会在组件生命周期的不同阶段执行。
ApplicationComponent中有initComponent()和disposeComponent()方法。initComponent()方法会在组件创建的时候被调用,disposeComponent()方法会在组件销毁的时候被调用。
ProjectComponent比ApplicationComponent多了两个方法,projectOpened()和projectClosed()。projectOpened()会在一个项目已经加载完成是调用,projectClosed()会在一个项目关闭后执行。
ModuleComponent比ProjectComponent多了一个moduleAdded()方法,会在模块已经被添加到project时执行。
如果开发者想开发一个图形界面,并嵌入到IDEA的面板中,则需要对IDEA中的组件进行扩展。
扩展和扩展点
扩展Setting面板
下面将展示插件在Setting面板中增加一项配置。
在pluginxml添加扩展信息。
接着写实现类,实现类必须实现Configurable接口,并重写改接口的方法。
createComponent()方法返回一个封装为JComponent对象的图形界面。开发者使用Java中的Swing进行图形界面的开发,并在此方法返回。使用时,当用户在Setting面板中点击此设置项,IDEA则会调用此方法,在面板中展示此界面。比如,输入return newJButton(“ok”),则会在面板中显示一个名称为ok的按钮。
isModified()方法则是用于监听界面中的内容是否有修改,当界面发生变化时会调用此方法。返回值为true时,Setting面板的Apply按钮可以点击;当返回值为false时,Apply按钮置灰,不能被点击。
apply()方法会在用户点击Apply按钮时执行,插件对于用户的响应 *** 作就可以放到此方法中进行。
reset()方法会在用户点击Cancel按钮时执行,可以用来还原设置。
disposeUIResources()方法会在当前界面消失的时候执行。比如当用户切换到其它设置项或Setting面板关闭时,会调用此方法。
运行效果
运行此插件,在Setting面板的Other Setting中可以看到此插件增加的设置项。
在用户使用插件的过程中,插件有时需要保存用户本次 *** 作的数据。比如用户上次选择的某个选项,在用户再次打开插件的时候,需要显示用户上次的选择。此时则需要将用户每次选择的数据进行持久化。IDEA提供了两种持久化的方式:PropertiesComponent和PersistentStateComponent。PropertiesComponent *** 作简单,适合保存简单、少量的的数据;PersistentStateComponent *** 作复杂,适合保存复杂、量多的数据。
PropertiesComponent
PropertiesComponent会把所有数据,以key-value的形式保存到一个IDEA的公共空间,所以定义的key必须是唯一的,建议使用项目名作为前缀。使用时,通过setValue()方法将数据保存到propertiesComponent中。
获取数据时,通过getValue()方法获取。
PersistentStateComponent
PersistentStateComponent的方式则会在本地新建一个xml文件,将插件数据保存到这个xml文件中。使用前需要先写一个PersistentStateComponent接口的实现类,用于定义xml文件。
以上的代码中,@State用于配置xml文件,name用于指定组件名称,storages用于指定文件保存的位置。在IDEA 2016以后的版本中,直接在@Storage注解为value属性赋值,值为xml文件的文件名,即@Storage(value = “filenamexml”)。value属性可以省略,直接填写文件名,插件使用时会在IDEA的用户目录中自动生成这个文件。
而在IDEA 2016及之前的版本,需要在@Storage注解中给id和file属性赋值(例如: @Storage(id = "rulesGroup", file="$APP_CONFIG$/rulesGroupxml"), $APP_CONFIG$ 为IDEA安装后的默认用户路径)。
持久化数据在xml文件中以key-value的形式保存,实现类中的属性名就是key。
以上的PersistentStateComponent实现类是将保存数据的属性定义在了实现类自身,当保存的数据较多时,对应的属性也会很多,类中的代码管理会显得混乱。这时可以在该实现类中定义一个内部类,把属性写到这个内部类中。
代码中的getState()方法,会在保存设置(比如settings窗口失去焦点,关闭IDEA)的时候调用。如果用户没有修改内容,则不会保存。loadState()方法会在创建组件或xml文件被外部改变的时候调用。
如果没有对实现类中属性进行封装,使用时可以直接对属性进行 *** 作。
建议对属性进行封装,通过get和set方法来或者属性值。
IDEA插件开发的技术点还有很多,比如进度条、PSI等。由于文章篇幅的限制,以上内容只是对其部分内容进行举例。希望能在以后为大家分享更多的IDEA插件开发技术。
aspnet中是这样的:
Session属性、方法
属性有下面两个:
1.SessionID 存储用户的Session ID
2.Timeout Session的有效期时长
方法只有一个: Abandon (用来清除Session对象)
利用Session可以保存变量或字符串等信息,语法如:Session(“Session名字”)=变量或字符串信息
从Session中调用该信息的语法:a=session(“Session名字”)
Session存储数组和存储简单信息基本上是一样的,只不过要记住。Session把传入的数组当成一个整体看待,只能把一个数组整体存入取出。
保存信息的语法:Session(“Session数组”)=数组变量
获取Session信息的语法:a=Session(“Session数组”)
利用Timeout属性可以修改Session对象的有效期时长,默认为20分钟。
语法:SessionTimeout=整数(分钟); 例如:<% SessionTimeout=30 ‘改为30分钟 %>
Session对象到期后会自动清除,但到期前可以用Abandon方法强行清除。
语法:SessionAbandon 例如:<% SessionAbandon %>
---------------------------------------------------
Application的使用也是比较简单的,你可以把变量或字符串等信息很容易的保,语法:Application(“Application名字”)=变量或字符串信息;获取Application中的信息也很容易
a=Application(“Application名字”)
利用Application对象存储数组信息和Session对象类似,也必须把数组当成一个整体存入和读取,只是存储时别忘了Lock和Unlock就行了。语法如下:Application(“Application数组”)=数组变量;获取Application信息的语法:a= Application(“Session数组”)
----------------------------
Globalasa文件用来存放Session对象和Application对象事件的程序,当Session或Application被第一次调用或结束时,就会运行Globalasa文件中对应的程序。
一般记录用户登录信息等都用session对象
application对象
什么是application对象?
( )当Web服务器启动时 Web服务器会自动创建一个application对象 application对象一旦创建 它将一直存在 直到Web服务器关闭
一个Web服务器通常有多个Web服务目录(网站) 当Web服务器启动时 它自动为每个Web服务目录都创建一个application对象 这些application对象各自独立 而且和Web服务目录一一对应
访问同一个网站的客户都共享一个application对象 因此 application对象可以实现多客户间的数据共享
访问不同网站的客户 对应的application对象不同
( )application对象的生命周期 从Web服务器启动 直到Web服务器关闭
注意 一个Web应用程序启动后 将会自动创建一个application对象 而且在整个应用程序的运行过程中只有一个application对象 也即所有访问该网站的客户都共享一个application对象
( )application对象的作用范围 application对象是一个应用程序级的对象 它作用于当前Web应用程序 也即作用于当前网站 所有访问当前网站的客户都共享一个application对象
具体来说 不管哪个客户来访问网站A 也不管客户访问网站A下哪个页面文件 都可以对网站A的application对象进行 *** 作 因为 所有访问网站A的客户都共用一个application对象
因此 当在application对象中存储数据后 所有访问网站A的客户都能够对其进行访问 实现了多客户之间的数据共享
( )application对象的基类是 javax servlet ServletContext类
注意 有些Web服务器不直接支持使用application对象 必须用ServletContext类来声明application对象 再调用getServletContext()方法来获取当前页面的application对象
( )ServletContext类 用于表示应用程序的上下文
一个ServletContext类的对象表示一个Web应用程序的上下文
具体来说 在Web服务器中 提供了一个Web应用程序的运行时环境 专门负责Web应用程序的部署 编译 运行以及生命周期的管理 通过ServletContext类 可以获取Web应用程序的运行时环境信息
常识 JSP引擎 Servlet引擎 JSP容器和Servlet容器 都是指Web服务器 Web服务器用于管理所有Web应用程序
( )application对象的常用方法 如下所示
方法名 描述 StringgetAttribute(Stringname) 根据属性名称获取属性值 EnumerationgetAttributeNames() 获取所有的属性名称 voidsetAttribute(Stringname Objectobject) 设置属性 指定属性名称和属性值 voidremoveAttribute(Stringname) 根据属性名称删除对应的属性 ServletContextgetContext(Stringuripath) 获取指定URL的ServletContext对象 StringgetContextPath() 获取当前Web应用程序的根目录 StringgetInitParameter(Stringname) 根据初始化参数名称 获取初始化参数值 intgetMajorVersion() 获取ServletAPI的主版本号 intgetMinorVersion() 获取ServletAPI的次版本号 StringgetMimeType(Stringfile) 获取指定文件的MIME类型 StringgetServletInfo() 获取当前Web服务器的版本信息 StringgetServletContextName() 获取当前Web应用程序的名称 voidlog(Stringmessage) 将信息写入日志文件中使用application对象存储数据
( )设置application对象的属性和获取application对象的属性
测试代码
TestApplication jsp
<%@pagelanguage=&# ;java&# ;contentType=&# ;text/;charset=GBK&# ;%>
<%request setCharacterEncoding(&# ;GBK&# ;);%>
<>
<body>
<formname=&# ;form &# ;action=&# ; method=&# ;post&# ;>
用户名
<inputtype=&# ;text&# ;name=&# ;username&# ;value=&# ; >
<br>
密码
<inputtype=&# ;password&# ;name=&# ;pwd&# ;value=&# ; >
<br>
<inputtype=&# ;submit&# ;name=&# ;btSubmit&# ;value=&# ;提交&# ;>
</form>
<%
application setAttribute(&# ;username&# ; request getParameter(&# ;username&# ;));
application setAttribute(&# ;pwd&# ; request getParameter(&# ;pwd&# ;));
%>
</body>
</>
测试代码
TestCommon jsp
在TestCommon jsp页面中 通过application对象获取属性 注意TestApplication jsp和TestCommon jsp这两个页面之间没有任何关联 只要通过application对象设置了属性 那么就可以在任何页面 通过application对象获取属性或者删除属性
<%@pagelanguage=&# ;java&# ;contentType=&# ;text/;charset=GBK&# ;%>
<%request setCharacterEncoding(&# ;GBK&# ;);%>
<>
<body>
用户名 <%=application getAttribute(&# ;username&# ;)%><br>
密码 <%=application getAttribute(&# ;pwd&# ;)%><br>
</body>
</>
( )删除application对象的属性
测试代码
TestCommon jsp
在TestCommon jsp页面中 删除application对象的属性
<%@pagelanguage=&# ;java&# ;contentType=&# ;text/;charset=GBK&# ;%>
<%request setCharacterEncoding(&# ;GBK&# ;);%>
<>
<body>
<%&# ;删除属性&# ;%>
<%
application removeAttribute(&# ;username&# ;);
application removeAttribute(&# ;pwd&# ;);
%>
用户名 <%=application getAttribute(&# ;username&# ;)%><br>
密码 <%=application getAttribute(&# ;pwd&# ;)%><br>
</body>
</>
使用application对象实现网站计数器
测试代码
TestApplication jsp
<%@pagelanguage=&# ;java&# ;contentType=&# ;text/;charset=GBK&# ;%>
<%@pageimport=&# ;java util &# ;%>
<%request setCharacterEncoding(&# ;GBK&# ;);%>
<>
<body>
<%!
ServletContextapplication;
synchronizedvoidcountPeople(){
application=getServletContext();
Integernumber=(Integer)application getAttribute(&# ;number&# ;);
if(number==null){
number=newInteger( );
application setAttribute(&# ;number&# ; number);
}else{
number=newInteger(number intValue()+ );
application setAttribute(&# ;number&# ; number);
}
}
%>
<%
if(session isNew()){
countPeople();
}
intpersonCount=((Integer)application getAttribute(&# ;number&# ;)) intValue();
%>
<p>欢迎访问本网站 您是第<%=personCount%>个访问用户!
</body>
</>
使用application对象获取初始化参数
( )一般来说 在web xml文件中 设置初始化参数有如下两种方式
n设置系统范围内的初始化参数
n针对单个Servlet文件或JSP文件设置初始化参数
对于系统范围内的初始化参数 可通过ServletContext接口的getInitParameter(Stringname)方法 根据指定的参数名 获取对应的参数值
对于针对单个Servlet文件或JSP文件设置初始化参数 可通过ServletConfig接口的getInitParameter(Stringname)方法 根据指定的参数名 获取对应的参数值 ( )如何设置系统范围内的初始化参数
在web xml文件中 可利用context param元素来设置系统范围内的初始化参数 context param元素应该包含param name param value以及可选的description子元素 如下所示 <context param> <param name>support email</param name> <param value></param value> </context param>
web xml文件的示例
<xmlversion=&# ; &# ;encoding=&# ;UTF &# ;>
<web appversion=&# ; &# ;
xmlns=&# ;;
xmlns:xsi=&# ;;charset=GBK&# ;%>
<%request setCharacterEncoding(&# ;GBK&# ;);%>
<>
<body>
<%&# ;使用application对象获取系统范围内的初始化参数&# ;%>
<fontcolor=&# ;Red&# ;>使用application对象获取初始化参数 </font>
<br>
<%
StringappName=getServletContext() getInitParameter(&# ;appName&# ;);
StringappVersion=getServletContext() getInitParameter(&# ;appVersion&# ;);
%>
应用程序的名称 <%=appName%><br>
应用程序的版本 <%=appVersion%>
</body>
</>
修改web xml文件 添加蓝色字体部分
<xmlversion=&# ; &# ;encoding=&# ;UTF &# ;>
<web appversion=&# ; &# ;
xmlns=&# ;;
xmlns:xsi=&# ;;charset=GBK&# ;
pageEncoding=&# ;GBK&# ;%>
<%request setCharacterEncoding(&# ;GBK&# ;);%>
<>
<body>
<h >使用application对象获取Web应用程序的环境信息</h >
<p>
<fontcolor=&# ;Red&# ;>获取当前Web服务器的版本信息 </font><%=application getServerInfo()%><br>
<fontcolor=&# ;Red&# ;>获取ServletAPI的主版本号 </font><%=application getMajorVersion()%><br>
<fontcolor=&# ;Red&# ;>获取ServletAPI的次版本号 </font><%=application getMinorVersion()%>
<p>
<fontcolor=&# ;Red&# ;>获得指定URL的ServletContext对象 </font>
<%
ServletContextsc=application getContext(&# ;/ch /TestApplication jsp&# ;);
out println(sc getServerInfo());
%>
<p>
<%&# ;需要在web xml设置display name元素&# ;%>
<fontcolor=&# ;Red&# ;>获取当前Web应用程序的名称 </font><%=application getServletContextName()%>
<p>
<fontcolor=&# ;Red&# ;>获取当前Web应用程序的上下文路径 </font><%=application getContextPath()%>
</body>
</>
测试结果
session对象和application对象的比较
( )两者的作用范围不同
session对象是用户级的对象 而application对象是应用程序级的对象
一个用户一个session对象 每个用户的session对象不同 在用户所访问网站的多个页面之间共享同一个session对象
一个Web应用程序一个application对象 每个Web应用程序的application对象不同 但一个Web应用程序的多个用户之间共享同一个application对象
在同一个网站下
n每个用户的session对象不同
n所用用户的application对象相同
在不同网站下
n每个用户的session对象不同
n每个用户的application对象不同
( )两者的生命周期不同
session对象的生命周期 用户首次访问网站创建 用户离开该网站(不一定要关闭浏览器)消亡
application对象的生命周期 启动Web服务器创建 关闭Web服务器销毁
lishixinzhi/Article/program/Java/hx/201404/30479
不要显示指定datatype,然后data改写成:
data:{fs_userId:fs_userId}如果你用的是struts2的话,后台定义一个fs_userId全局变量即可接受!
把action注入到Spring中,然后通过Spring的Application获取要调用的action执行里面的方法即可,不过action需要有请求访问action才会有request和response对象,直接调用会出错的,所以还是在job里面写一个>
补充:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
以上就是关于用spring管理action 怎么获取servletconfig全部的内容,包括:用spring管理action 怎么获取servletconfig、IDE插件在58研发提效上的实践、7. Session和Application对象都有哪些事件这些事件在什么情况下发生应将这些事件的脚本包含在哪个文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)