现在的位置: 首页 > 综合 > 正文

天乙社区社区首页分析(二)

2018年02月21日 ⁄ 综合 ⁄ 共 2518字 ⁄ 字号 评论关闭

在main.jsp中有下面的两句代码:


这里的nagUrl和inUrl是在哪里定义的?

分析:
先看Login.java的execute方法中有以下语句:

这句话在if(this.getAction().equalsIgnoreCase("index"))和equalsIgnoreCase("relogin")的判断分支中都有,这里假设我们初次登录则执行”index”分支中的。BBSCSUtil的getActionMappingURLWithoutPrefix方法只是进行了一些字符串处理操作,用来构造出正确的请求的URL。可见在登录成功时所用的跳转是main.bbscs这个请求的URL。找到名字为main的action的定义如下(在struts.xml中):


可知返回success则跳转到main.jsp,其处理实现类是Main,看Main.java。由于在Main的execute方法中最后一定会返回success,所以其实这个main请求一定会跳转到main.jsp页面。其实到这里才算真正确定了登录成功后跳转到的页面(即社区首页)就是mian.jsp。
Main的nagUrl和inUrl这两个属性也在execute方法中被设置,设置如下:


由于在执行Login请求前Login类中的action属性并没有复制并且Constant.USE_URL_REWRITE为初始值fasle,所以方法执行会进入这两个else分支
名为in的请求(action)在struts.xml中有定义:

其实现类指定的inAction(bean)在action-servlet.xml中有定义(bean的实现类是com.laoer.bbscs.web.action.In)。这里请求处理返回success则跳转到in.jsp页面(事实上In中的execute方法也只会success)。这说明在正常情况下,main.jsp的第一个iframe的确显示的是in.jsp。
回头看最开始提出的问题,main.jsp中的inUrl和nagUrl指的就是In类对象中的inUrl和nagUrl属性。由于这里main.bbscs是当前的请求(即action),所以产生的action对象会放在值栈中,在main.jsp页面中就是用OGNL表达式%{inUrl},取出了值栈中action对象中的inUrl这个属性。%{nagUrl}的分析也类似。
不过在这里去掉%{}可以吗?可以做小实验试试。
顺便说一下,在main.jsp的头部,是通过自定义标签来输出页面的标题的,如下:

而要实现自定义标签,其实就是对自定义的标签进行人为解释,然后通过一个Writer参数,输出在标签位置处你真正想要显示的效果的jsp代码。以<bbscs:webInfo>标签为例,其定义在bbscs.tld中,其实现类是WebInfoTag,而WebInfoTag中所用的component类是WebInfo(均在com.laoer.bbscs.web.taglib包中),在WebInfo的start方法中可以看到这个自定义标签是如何被解析处理的。上面的语句中的标签效果就是输出社区的名字和Powerd by信息。其他jsp页面中的以bbscs开头的自定义标签也类似地去分析就可以了。

下面来看看社区首页的主界面部分(即右边部分)in.jsp的实现:
首先是整体的框架,容易看出in.jsp主要由7个div和一个table构成
第一个div: head

第二个div: info

其又由两个div组成,其中info1显示社区信息,info2显示当前在线
第三个div:若以游客身份登录则是login:

若以用户身份登录则是myinfo:

第四个div:broard

第五个div: posts

第六个div:topuser

这部分看起来不能正确显示,不知道为什么。。
第七个div:search

最后是一个显示广告和脚注的table

Posts中的表格中表头和表内容的分隔效果是如何做到的?
答:对不同的<tr>标签使用不同的class就可以了,css中可以设定表格每行的背景色(background-color)和边框宽度(border)。
来看一下这段代码:

首先用<s:url>标签产生一个url地址,该地址是input.bbscs请求的url地址,指定url的引用为regurl(这样生成的URL就不会再页面上输出,但可以引用)。下面定义了一个超链接文本,链接的url就是上面生成的url的id(引用),${}是EL表达式。文本内容通过<s:text>标签来输出,即输出资源文件中所设置的值,这里用到的资源文件是com.laoer.bbscs.web.action包中的BaseAction.properties文件,这里in.reg的值就是“注册”。
以上就是典型的在jsp页面中设置超链接文本,in.jsp里链接大多是这样实现的,如登录,注册,个人中心下的链接等等。

看一下下面这段代码:

先用<s:set>标签将value中的值作为对象放入指定范围内,这里是默认的OGNL上下文中。对象的引用为bl2。value所赋的值使用了OGNL表达式,其中boardMap是In类中的属性,#board.id中的board在如下的地方定义:
 
它是一个用于迭代的临时对象,并不放在值栈中,而是一个OGNL上下文中的普通对象,所以在取其属性值时要加#前缀。然后用<s:iterator>对bl2进行迭代(boradMap.get方法返回的是一个list对象),所用临时对象是b,再下面就是一对<tr>标签所包裹的代码,即输出表格中的一行内容。由于<tr>是包含在<s:iterator>里的,所以就会循环输出,即输出多行,其中每一行所用到的对象b是不一样的。这就是典型的在jsp页面中动态地输出表格。

页面中用%{}(OGNL表达式)所取的值大多都是In类(in.bbscs请求的处理类)中的属性,并且在其execute方法中有进行赋值等操作。

页面实现代码的其他具体细节分析,以及点击链接后的跳转功能实现,在此就不分析了。等之后可以自己再深入研究。

抱歉!评论已关闭.