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

在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方法中有进行赋值等操作。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算八字神煞需要用到农历和天干地支的知识,可以使用 PHP 的日期和时间函数来实现。 步骤如下: 1. 获取用户输入的阳历生日,使用 PHP 的 date 函数将其转换为农历生日。 2. 根据农历生日,计算出生年、生月、生日的天干地支。 3. 根据天干地支,查找对应的八字神煞。 以下是一个简单的 PHP 代码示例: ```php // 获取用户输入的生日 $birthday = '1990-01-01'; // 将阳历生日转换为农历生日 $chineseBirthday = getChineseBirthday($birthday); // 计算出生年、月、日的天干地支 list($yearTianGan, $yearDiZhi) = getTianGanDiZhi($chineseBirthday['year']); list($monthTianGan, $monthDiZhi) = getTianGanDiZhi($chineseBirthday['month']); list($dayTianGan, $dayDiZhi) = getTianGanDiZhi($chineseBirthday['day']); // 查找八字神煞 $shenSha = getShenSha($yearTianGan, $yearDiZhi, $monthTianGan, $monthDiZhi, $dayTianGan, $dayDiZhi); // 输出结果 echo '您的八字神煞为:' . implode(',', $shenSha); // 获取农历生日 function getChineseBirthday($birthday) { // 使用 PHP 的 DateTime 类将阳历生日转换为农历生日 $dateTime = new DateTime($birthday); $chineseCalendar = new ChineseCalendar($dateTime); $chineseBirthday = [ 'year' => $chineseCalendar->getChineseYear(), 'month' => $chineseCalendar->getChineseMonth(), 'day' => $chineseCalendar->getChineseDay(), ]; return $chineseBirthday; } // 计算天干地支 function getTianGanDiZhi($chineseValue) { // 天干 $tianGan = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸']; // 地支 $diZhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']; // 计算天干地支 $index = ($chineseValue - 4) % 60; $tianGanIndex = $index % 10; $diZhiIndex = $index % 12; $tianGanValue = $tianGan[$tianGanIndex]; $diZhiValue = $diZhi[$diZhiIndex]; return [$tianGanValue, $diZhiValue]; } // 查找八字神煞 function getShenSha($yearTianGan, $yearDiZhi, $monthTianGan, $monthDiZhi, $dayTianGan, $dayDiZhi) { // 八字神煞表 $shenShaTable = [ '甲子' => ['天乙', '文昌'], '甲戌' => ['天厨', '文曲'], '乙丑' => ['吊客', '天哭'], '乙酉' => ['陀罗', '天虚'], '丙寅' => ['将星', '天月'], '丙申' => ['天巫', '天德'], '丁卯' => ['天才', '天福'], '丁酉' => ['天寿', '天恩'], '戊辰' => ['天贵', '天使'], '戊戌' => ['天荫', '天罡'], '己巳' => ['天福', '天官'], '己亥' => ['天伤', '天蓬'], '庚午' => ['天空', '天任'], '庚子' => ['天后', '天伯'], '辛未' => ['天印', '天威'], '辛酉' => ['天权', '天禄'], '壬申' => ['天德', '天乙'], '壬子' => ['天才', '天英'], '癸未' => ['天寿', '天巫'], '癸酉' => ['天恩', '天贵'], ]; // 查找八字神煞 $shenSha = []; $key = $yearTianGan . $yearDiZhi; if (isset($shenShaTable[$key])) { $shenSha = array_merge($shenSha, $shenShaTable[$key]); } $key = $monthTianGan . $monthDiZhi; if (isset($shenShaTable[$key])) { $shenSha = array_merge($shenSha, $shenShaTable[$key]); } $key = $dayTianGan . $dayDiZhi; if (isset($shenShaTable[$key])) { $shenSha = array_merge($shenSha, $shenShaTable[$key]); } return $shenSha; } ``` 需要注意的是,以上代码示例中使用了第三方库 `ChineseCalendar` 来实现阳历和农历的转换,使用前需要先安装该库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值