struts2 地址栏权限中怎样设置文本框的输入权限 就是说有权闲的时候可以输入值 没权限的时候是灰色

vb 6.0中的权限设置怎么写?_百度知道
提问者采纳
权限是一个中小型以上的软件必须考虑的问题。不管是什么语言写权限的方式是多样灵活的。针对VB而言我建议初学者还是用DB和类模块结合来做。在服务器端我们建立数据库用户表的时候,就应该多建立一个权限字段,标记他是什么样的权限或者说明。在软件里初始化界面的时候我们可以通过窗体传值、后台服务,或者是检索服务器数据库表来判断权限分配。就效率和速度而言,后台服务绝对是最快的,窗体传值其次,最慢的是查数据库找用户权限。难易程度肯定正好相反。VB不能做服务底层,但是可以写类模块。从最简单的写法说起,在类模块里,我们引用ADO(不是窗体控件,要ADO库)查询数据库写成带参数的函数,参数是控件ID,公布函数,每次初始化对象调用函数,查询权限,初始化也用函数初始化,这样的办法重复做查询数据库的事情,影响程序运行效率,但是很常用。比如VB做分辨率初始化、管理员初始化都是这么写的。最简单老土的办法是窗体传值,就是在登陆事件中就把权限查出来,在窗体上建立一个文本框为例,事件响应在验证通过后,把权限信息赋值文本框,文本框隐藏起来。其他的窗体Form_Load的时候都要去判断一下
登陆窗体.Text1 的值进行初始化他的界面,哪些该用哪写不该用,就要你一个一个写判断过程了,代码绝对比第一种麻烦,老是写同样的代码,比起刚才写类模块就麻烦在这里。VB6.0界面上的控件不要单独建立,比如你要建立text控件,就建立一个作为复制依据放在窗体其他部位,设计好了后可以把他处理掉,设计的时候复制他创建控件组,这样你的控件就是一个有规律的控件,可以给控件规则,如Text1(0),Text1(1)
他的Index值是变量,Text1事件中写权限就统一设计好了所有Text1(Index)的权限,这是一个技巧。第二就是你要用虚方法,窗体名称和按钮或者控件之间要建立联系。比如按钮的Caption值可以和窗体名称是一样的,这样你就可以通过点击按钮去打开窗体,按钮是控件组,打开窗体就有了权限。如:If 登陆窗体.Adodc1.Recordset.Fields(&权限&)=“普通用户& ThenMsgBox(&对不起,你没有权限...&)ElseDim Fro as Form
'定义一个抽象窗体对象Set Fro = Forms.Add(按钮(Index).Caption)Fro.ShowEnd If窗体上的所有按钮分为一级按钮、二级按钮、三级按钮,复制建立他们,就是:一级按钮(0),一级按钮(1) ....二级按钮(0) .........点一级按钮是个怎样的事件你写一下,二级按钮是个怎么样的事件你也写一下....,学过C++的人很容易理解,就是个宏事件。其实你也没必要建立那么多窗体去切换界面,完全可以用Frame,Frame也用控件组,切换到哪个Frame的时候初始化一下界面就OK了,没切换到全部隐藏,Frame就象窗体界面一样独立容器,设计好以后你就把他拉到最小放一边,隐藏起来,全部设计完毕,窗体就靠一个一个初始化Frame来做界面切换,很是美观,也方便,因为方法可以直接用类来写了。楼主有疑问可以发个实例,邮箱留下
,谢谢!!
提问者评价
谢谢你的耐心解答,好详细呀
来自团队:
其他类似问题
为您推荐:
其他3条回答
权限管理想做好了可不是那么容易,你在这里估计找不到完美答案。简单说一下:1、建立权限表。具体内容不说了,根据自身情况定。2、在人员、角色或具体事务的库中添加权限字段。3、权限字段应该是灵活的、可叠加的。比如:二进制法,用数字的指定二进制位是否为1来区分是否具有该权限;字符串法,选好分隔符,用形似“|1|4|12|357|”的字符串来记录是否拥有该权限。4、在适当的位置调用权限确认子函数。(有些权限需要前置动作,有些权限需要时间限制等)5、编写完善的权限管理界面。总之,这事是很复杂的,远比一般人想的要麻烦。
权限管理,要做好也不是那么容易的,你无法找到一个完美的答案,这里估计。 简单: 1,建立权限表。具体内容就不说了,根据自己的情况。
2,添加权限的现场工作人员,在图书馆或特定交易的作用。
3,权限字段应该是灵活的,可叠加。如:二进制方法,与一些指定位是否区分是否有权限;字符串的方法,选择合适的分隔符,形状| 1 | 2 | 12 | 357 |“字符串记录拥有此权限。 4,子功能的呼叫权限确定适当的位置。(某些权限需要预先行动,一些权限需要时间的限制) 5书面许可管理界面。总之,这是一个非常复杂的事情,麻烦比大多数人想象的。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁struts2中theme属性包括xhtml,html,simple,ajax 。默认是xhtml
theme:设置struts2标签的主题,默认为xhtml。
theme=xhtml时:会默认额外生成tr,td。
theme=simple时:就生成标签所对应的html标签形式。
在默认情况下,表单元素是分布在不同行的。如下代码:
&s:form action="login2"&
&&& &s:textfield label="用户名" name="username"/&
&&& &s:password label="密码" name="password"/&
&&& &s:submit label="提交"/&
我们看着以上的代码跟HTML的差不了多少,但是因为struts2表单默认将表单内的每一个元素都分在单独的一行,label属性就如同我们在HTML中在&input type="text"/&前面的文字标签一样。如果我们不想让它自动换行,那就应该写成如下格式:
&s:form action="login2" theme="simple"&
&&& &s:textfield label="用户名" name="username"/&
&&& &s:password label="密码" name="password"/&
&&& &s:submit label="提交"/&
但在设置theme="simple"后,表单元素的label属性将失效,这时我们就得在表单元素前面加入想用label显示的文字。如:
&s:form action="login2" theme="simple"&
&&&&& 用户名:&s:textfield label="用户名" name="username"/&
&&&&& 密码:&s:password label="密码" name="password"/&
&&& &s:submit label="提交"/&
此时显示的为将不在是label中的值,而是显示文本框前面的文字,按钮则显示它原来的默认值:sbumit。
以下为扩充知识:
1. 模板目录->主题目录->主题(模板文件) 这是模板/主题的目录组织方式。以实际为例,打开 struts2-core-2.x.x.jar 可以看到里面有一个 template,在 template 下有5个目录 ajax、css_xhtml、simple、xhtml 和 archive,其中前四个分别是 ajax、css_xhtml、simple、xhtml 主题的目录,每个主题目录中有各自的模板文件,主要是 ftl 文件,还有 css 和 js 文件。最后一个 archive 是归档的主题目录,其下又有 ajax、simple、xhtml、模板文件是 .vm 文件。由此可知 Struts2 大力推荐的模板语言是 FreeMarker,而不是 Velocity,以后要好好看看 FreeMarker,只知道 FreeMarkder 更 XML 化。
2. 上面看到模板目录名是 template,是 struts2-core-2.x.x.jar 中,其实目录名是由 struts.ui.templateDir 常量来指定的,只是默认值是 template。意味着 Struts 2 从 Web 应用的 template 目录或 CLASSPATH 的 template 目录(包) 中依次加载特定的模板文件。
3. 比如我们使用一个 select 标签,且指定主题为 xhtml,则加载模板文件的顺序为 (1) Web 应用/template/xhmlt/select.flt&&& (2) CLASSPATH/template/xhtml/select.ftl。Struts2 默认是用的 FreeMarkder 模板技术,可设置常量 struts.ui.templateSuffix 来改变默认的模板技术,可选值有 ftl、vm、jsp。但是对于 vm 和 jsp 要自己提供完整的实现,Struts2 可没帮你做这些。
4. 有时候我们想要自定义主题,如你希望输入框前的标签显示红颜色,你不想要校验错误提示在输入框正上方而是右边。当然你可以修改 struts2-core-2.x.x.jar 中 template 下某个主题的模板文件,或拷一份到 Web 应用目录的 template 目录修改要定制的模板,这样做总有些不爽。Struts2 还支持两种更灵活的主题定制方式。包装和继承现有主题,可以同时使用。
最简单的主题定制方式是利用主题模板的加载优先级,把自定义的模板文件放在优先级高的目录,比如放一个 text.ftl 在 WEB-INF/classes/template/xhtml/ 目录下,它将覆盖掉 struts2-core-2.x.x.jar 里的 template/xhtml/text.ftl 的定义。
5. 先看一个包装的例子,在 xhtml 下的 combobox.ftl 的内容如下:
&#include "/${parameters.templateDir}/${parameters.theme}/controlheader.ftl" /&
&#include "/${parameters.templateDir}/simple/combobox.ftl" /&
&&& &#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" /&&#nt/&
它就是对 simple/combobox.ftl 的基础上包装上一个 controlheader.ftl 和一个 controlfooter.ftl,包装的局限性是你仍然是要为每一个 UI 组件提供单独模板文件,即全套的。
和设计模式中的包装(装饰)模式如出一辙,如 BufferedInputStream 包装了 InputStream,但在 BufferedInputStream 提供了全套的和 InputStream 一样的操作方法。
6. 再说继承来自定义主题,如果简单改变个别 UI 的风格,继承就是最为高效的了。此继承与 Java 的继承(即extends) 也是一马事。要改变或要新加的用自己定义的,其他的延用父主题的。举个例子,自定义一个名为 custom 的主题继承自 xhtml,只改变 select 标签的风格,你要做的就是编辑自己的一个 select.ftl 放在 WEB-INF/classes/template/custom 下,并在此目录下放一文件 theme.properties,内容是:
#指定该主题以 xhtml 为基础进行扩展
parent=xhml
使用可指定给 UI 标签,例如 &s:form name="aa" theme="custom" ...,效果就会是 form 下的 select 使用了在 custom 目录下自定义的 select.ftl,其他的直接使用父主题 xhtml 中的模板文件。Struts2 提供的 ajax 主题就是继承自 xhtml 主题的。
7. 简单说一下 Struts2 的内建主题,包括 simple、xhtml、css_xhtml 和 ajax。simple 主题不用多说,比Struts1 的 html 标签还弱些,只对应简单的 html 元素,不生成额外内容。xhtml 是默认主题,是对 simple 主题的包装和扩展(也就是继承),该主题下有一个 head.ftl 用来导入 javascript 类库(如 dojo)。xhtml 在 simple 的基础上增加了以下特性:
&&& 1) 针对 HTML 标签(如 textfield和select标签) 使用标准的两列表格布局
&&& 2) 每个 HTML 标签有 label 属性,默认左边显示,可通过 labelposition 属性设定位置
&&& 3) 自动输出后台校验错误或 javascript 前端校验错误
8. 继续 Struts2 的内建主题的话题。css_xhtml 主题是对 xhtml 的扩展,显示是加入了 css 样式控制特性。ajax 主题是对 xhtml 主题的扩展,在 xhtml 主题的每个标签增加了 ajax 的支持(以 Djoj 和 DWR 为基础)。所增 Ajax 特性有:
&&& 1) Ajax 方式的客户端校验
&&& 2) 远程表单的异步提交
&&& 3) 高级 div 标签,允许局部更新
&&& 4) 高级 a 标签,允许动态加载并执行远端的 javascript 代码。
&&& 5) 提供支持 ajax 的 tabbedPanel
&&& 6) 提供&富客户端& 模型的 pub-sub 事件模型
9. 先前有网友问过我,他用了 Struts2 的校验,但是错误输出是在输入框的上方,但希望错误信息是显示在输入框的右方,该如何做。当时我只告诉了他要修改模板文件,也只是大概告诉了他是在某个 template 目录下的一个 ftl 文件,因那时具体操作自己也不太清楚。现在知道了线索,但实际修改还是很麻烦的。
&&& 输入框 &s:textfield .../& 默认是用的 xhtml/text.flt 模板,text.ftl 包装了 smple/text.ftl,错误信息可以追溯发现是在 controlheader-core.ftl 中定义显示的,所以你可以把 xthml/text.ftl 和 controlheader-core.ftl 拷到 WEB-INF/classes/template/xhtml 目录中进行修改,WEB-INF/classes/template/xhtml 中的模板文件是优先于 struts2-core-2.x.x.jar 里的 template/xhtml 目录中的模板文件加载。
10. 看有些地方只笼统介绍说:所有表单元素都存在一个特殊的属性:form,这个属性引用元素所在表单,通过该属性实现表单元素与表单间的交互,例如可通过 ${parameters.form.id} 访问表单的 ID。对这句话我只是感到一头雾水,查看像 &s:textfield .../& 等标签并无 form 属性,用 &s:textfield value="${parameters.form.id}" name="aa"/& 也看不到输出所在表单的 ID。去网上找找,才知道前面那句话有出入,其实说的是在主题模板文件里的用法,打开一些主题模板文件,如 combobox.ftl 或 controlheader-core.ftl 文件,你就能看到许多的 parameters 的表示法-- parameters.required、parameters.id。想见一下 parameters 属性才是根本,它代表了表单元素的属性集,parameters 说来还有点像 this,this.id、this.form.id、this.required 等等...
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94365次
积分:1217
积分:1217
排名:第18965名
原创:45篇
转载:21篇
评论:33条
(1)(1)(1)(7)(15)(5)(3)(25)(8)struts2中的radio怎么实现这个功能:求高手指导,谢谢_百度知道
提问者采纳
&s:radio id=&currency& name=&trade.currency& list=&#{'0':'EUR','1':'USD'}& value=&0& onclick=&selected(this.value)&&&/s:radio& function selected(value){
if(value==0){
document.getElementById(&usd&).readOnly=&true&;
document.getElementById(&eur&).readOnly=&&;
}else if(value==1){
document.getElementById(&eur&).readOnly=&true&;
document.getElementById(&usd&).readOnly=&&;
嗯,谢谢,你的方法试过,行的,js该怎么写呢,
js代码已经在上面了
提问者评价
按照你说的,真的成功了,好开心,谢谢你!
其他类似问题
为您推荐:
其他2条回答
用JS可以很容易解决,如果Radiobutton的值为EUR的时候,输入框USD的disabled属性给个ture就行了。反之亦然。由于你没有给出下面输入框ID,就随手写写下面给出JQuery的实现:var v= $('input:radio[id=currency]:checked').val();if(v==EUR){ //通过设置disabled的boolean属性将第三个text输入框disabled属性置为true $(&#USD&).attr(&disabled&,true); }if(v==USD){ //通过将第三个text输入框disabled属性置为false来移除disabled属性 $(&#EUR&).attr(&disabled&,false); } });代码仅供参考,稍作修改应该就能OK。
下面两个输入框的id分别为:buy和sale能给下js的代码及怎么写么,没弄过js可是项目要求js,非常感激
………………,用个onclick事件就解决了么,先判断radio的值,根据值对不同的text框的readonly参数进行设置
struts2的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁trackbacks-0
&&&&在用strust2做项目时遇到一个问题,我用struts2中datetimepicker 标签时只想让用户用后面的选择按钮来选择日期,
而不想让用户输入,因为用户的输入很可能不符合日期格式的要求。
&&&&于是我就在&s: datetimepicker &标签中加入了disabled=“true",但是我发现这个设置根本不起作用。
&&&&我开始到网上去找这方面的资料,我发现遇到这个问题的人还真不少,但是都没有找到好的解决方案。
于是我开始自己琢磨这这个问题,经过很多次的实验我发现,&s: datetimepicker &控件其实是一个DIV,
他的innerHTML是的具体内容如下:&
&INPUT&type=hidden&name=""&dojoAttachPoint="valueNode"&&INPUT&style="VERTICAL-ALIGN:&&WIDTH:&7em"&name=""&__doClobber__="true"&dojoAttachPoint="inputNode"&autocomplete="off"&&&IMG&style="VISIBILITY:&&VERTICAL-ALIGN:&&CURSOR:&hand"&alt="Select&a&date"&src="http://localhost:9998/wherp/struts/dojo/src/widget/templates/images/dateIcon.gif"&__doClobber__="true"&dojoAttachPoint="buttonNode"&dojoAttachEvent="onclick:&onIconClick"&
&DIV&class=dojoPopupContainer&style="DISPLAY:&&Z-INDEX:&10;&POSITION:&absolute"&dojoAttachPoint="containerNode"&explodeClassName="calendarBodyContainer"&
&DIV&class=datePickerContainer&dojoAttachPoint="datePickerContainerNode"&
&TABLE&class=calendarContainer&cellSpacing=0&cellPadding=0&
&TD&class=monthWrapper&vAlign=top&
&TABLE&class=monthContainer&cellSpacing=0&cellPadding=0&border=0&
&TD&class="monthCurve&monthCurveTL"&vAlign=top&&/TD&
&TD&class=monthLabelContainer&vAlign=top&&SPAN&class="incrementControl&increase"&__doClobber__="true"&dojoAttachPoint="increaseWeekNode"&dojoAttachEvent="onClick:&onIncrementW"&&IMG&style="WIDTH:&7&HEIGHT:&5px"&alt=↓&src="http://localhost:9998/wherp/struts/dojo/src/widget/templates/images/incrementMonth.png"&&&/SPAN&&SPAN&class="incrementControl&increase"&__doClobber__="true"&dojoAttachPoint="increaseMonthNode"&dojoAttachEvent="onClick:&onIncrementM"&&IMG&alt=↓&src="http://localhost:9998/wherp/struts/dojo/src/widget/templates/images/incrementMonth.png"&dojoAttachPoint="incrementMonthImageNode"&&&/SPAN&&SPAN&class="incrementControl&decrease"&__doClobber__="true"&dojoAttachPoint="decreaseWeekNode"&dojoAttachEvent="onClick:&onIncrementW"&&IMG&style="WIDTH:&7&HEIGHT:&5px"&alt=↑&src="http://localhost:9998/wherp/struts/dojo/src/widget/templates/images/decrementMonth.png"&&&/SPAN&&SPAN&class="incrementControl&decrease"&__doClobber__="true"&dojoAttachPoint="decreaseMonthNode"&dojoAttachEvent="onClick:&onIncrementM"&&IMG&alt=↑&src="http://localhost:9998/wherp/struts/dojo/src/widget/templates/images/decrementMonth.png"&dojoAttachPoint="decrementMonthImageNode"&&&/SPAN&&SPAN&class=month&dojoAttachPoint="monthLabelNode"&四月&/SPAN&&/TD&
&TD&class="monthCurve&monthCurveTR"&vAlign=top&&/TD&&/TR&&/TBODY&&/TABLE&&/TD&&/TR&&/THEAD&
&TD&colSpan=3&
&TABLE&class=calendarBodyContainer&cellSpacing=0&cellPadding=0&border=0&
&TR&dojoAttachPoint="dayLabelsRow"&
&TD&日&/TD&
&TD&一&/TD&
&TD&二&/TD&
&TD&三&/TD&
&TD&四&/TD&
&TD&五&/TD&
&TD&六&/TD&&/TR&&/THEAD&
&TBODY&__doClobber__="true"&dojoAttachPoint="calendarDatesContainerNode"&dojoAttachEvent="onClick:&_handleUiC"&
&TR&dojoAttachPoint="calendarWeekTemplate"&
&TD&class=previousMonth&<span style="color: #&/TD&
&TD&class=previousMonth&<span style="color: #&/TD&
&TD&class=previousMonth&<span style="color: #&/TD&
&TD&class=previousMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&&/TR&
&TR&dojoAttachPoint="calendarWeekTemplate"&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&&/TR&
&TR&dojoAttachPoint="calendarWeekTemplate"&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&&/TR&
&TR&dojoAttachPoint="calendarWeekTemplate"&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class="currentMonth&currentDate"&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&&/TR&
&TR&dojoAttachPoint="calendarWeekTemplate"&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=currentMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&&/TR&
&TR&dojoAttachPoint="calendarWeekTemplate"&
&TD&class=nextMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&
&TD&class=nextMonth&<span style="color: #&/TD&&/TR&&/TBODY&&/TABLE&&/TD&&/TR&&/TBODY&
&TD&class=yearWrapper&colSpan=3&
&TABLE&class=yearContainer&cellSpacing=0&cellPadding=0&border=0&
&TD&class=curveBL&vAlign=top&&/TD&
&TD&vAlign=top&
&H3&class=yearLabel&&SPAN&class=previousYear&__doClobber__="true"&dojoAttachPoint="previousYearLabelNode"&dojoAttachEvent="onClick:&onIncrementY"&<span style="color: #09年&/SPAN&&SPAN&class=selectedYear&dojoAttachPoint="currentYearLabelNode"&<span style="color: #10年&/SPAN&&SPAN&class=nextYear&__doClobber__="true"&dojoAttachPoint="nextYearLabelNode"&dojoAttachEvent="onClick:&onIncrementY"&<span style="color: #11年&/SPAN&&/H3&&/TD&
&TD&class=curveBR&vAlign=top&&/TD&&/TR&&/TBODY&&/TABLE&&/TD&&/TR&&/TFOOT&&/TABLE&&/DIV&&/DIV&
&&&&第一个子元素是一个隐藏域的表单,
&&&&第二个就是我们看见的文本输入框.
&&&&日期控件的如下:
&s:datetimepicker&name="starttime"&id="starttime"&displayFormat="yyyy-MM-dd"&&/s:datetimepicker&
&&&&我们想要做的就是让第二个子元素的disabled="true",所以我们可以这么做:
然后写javascript,代码如下:
document.getElementById("starttime").childNodes(<span style="color: #).disabled="true";
其中childNodes(1)代表是第二个子元素,也就是我们不想让用户输入的文本框。
目的达到。
但是这又遇到了另外一个问题设置成disabled的时候,Action中获取不到页面中相应的值.
用如下方式:
document.getElementById("startTimeId").childNodes(1).setAttribute("readOnly","true");
或document.getElementById("starttime").childNodes(1).readOnly="true"; //注意readOnly中o大写
就能获取值了.
我又尝试隐藏选择按钮图片:
document.getElementById("startTimeId").childNodes(2)获取第三个元素的时候发现是空格(狂晕).
document.getElementById("startTimeId").childNodes(3)才是那个图片!
document.getElementById("startTimeId").childNodes(3).style.display& =& "none";&&&&&&&&//删掉图片原来所占的位置
document.getElementById("startTimeId").childNodes(3).style.visibility& =& "hidden";&&&&//保留图片位置.
阅读(2001)}

我要回帖

更多关于 struts2权限管理 的文章

更多推荐

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

点击添加站长微信