【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十节)

本节主要讲解详情页的页面布局和css样式,以及从主页面到详情页面的跳转问题。

1. 详情页面的布局

页面布局的话,我还是习惯先把静态页面做出来,确保没问题了,然后再跟后台对接。

在实际的开发过程中,静态页面一般是美工或者前端工程师负责,后台工程师主要关心如何把Java层的数据贴到静态页面。(虽然我经历的几个公司都是自己一个人全包了。。。)

之前我已经把我个人绘制静态页面的过程,还有自己的思路写出来了,所以从本节开始,我不会再写得那么详细,而是根据页面效果来简明扼要地介绍一下。

我绘制页面的一般流程,就是先在脑子里形成一个大概的模样,就是搞清楚到底要画一个怎样的页面?甚至还可以弄个草图,然后根据草图来逐步写html和css代码。

首先是搭骨架,骨架就是html代码。

搭好了骨架,才是添加css代码的时候。

我个人绘制页面,都是遵循这样一个流程。

好了,先看看效果:

1.gif

页面布局简图:

Paste_Image.png

第一部分,是文章的展示区域。

html骨架

<!-- 内容区 -->
<div class='article'>
    <div class='title'>文章标题</div>
    <div class='category'><span class='light-font'>分类:</span><span class='info'>编程代码类</span></div>
    <div class='publicDate'><span class='light-font'>发布时间:</span><span class='info'>2016-10-27</span></div>
    <hr/>
    <div class='content'>
        <p>初学javascript的人,都会接触到一个东西叫做闭包,听起来感觉很高大上的。网上也有各种五花八门的解释,其实我个人感觉,没必要用太理论化的观念来看待闭包。

        <p>事实上,你每天都在用闭包,只是你不知道罢了。
        
        <p>比如:
        
        var cheese = '奶酪';
        
        var test = function(){
            alert(cheese);
        }
        OK,你已经写了一个闭包。
        
        <p>函数也是一个数据类型</p>
        <p>变量 cheese 是在全局作用域中的一个变量,当你创建了一个 test 函数,那么,test 和 cheese 就共享一个全局作用域。</p>
        
        <p>你要额外明白的一点是,在js中,函数和变量本质上是一个东西。函数也是一个数据类型。</p>
        
        <p>从上面的定义中也能看出来这一点。你要是不相信的话,我们来看一下咯。</p>
        
        <p>alert(cheese);</p>
        <p>alert(test);</p>
        
        <p>Paste_Image.png</p>
        
        <p>Paste_Image.png</p>
        <p>让我们再来看看 test 和 cheese各是什么类型:</p>

    </div>
</div>

文章内容都是一些测试数据

展示一篇文章,包含这篇文章的标题,分类和发布时间,当然还有作者信息。

首先是文章标题,它就是一个div,没什么大不了的。不要把它想得太复杂了。

<div class='title'>文章标题</div>

标题的css:

.article .title {
    text-align: center;
    font-size: 28px;
    color: #565353;
    letter-spacing: 2px;
    margin-top:20px;
}

文字居中:

text-align: center;

这句话能让这个div里面的文字居中显示,所以你才能看到这个居中效果:

Paste_Image.png

标题的字体肯定不能太小了,所以我先给它一个28px。

font-size: 28px;

我觉得字体太黑了不好看,就把颜色稍微调淡了一些。

color: #565353;

接着是字间距,我们不希望每个字都紧凑得挤在一起,所以让字与字之间稍微空开一点。

letter-spacing: 2px;

这表示空开2个px。

letter-spacing真的可以做到,有图为证。

1.gif

向上的间距也要调大一点,不然紧紧贴着标题栏肯定不好看。

margin-top:20px;

就20个px吧。

Paste_Image.png

这样就差不多了。

接下来是这一块。

Paste_Image.png

可以看到,两边的颜色是不一样的。很显然,我肯定是给他们分别加了样式。

<div class='category'><span class='light-font'>分类:</span><span class='info'>编程代码类</span></div>
<div class='publicDate'><span class='light-font'>发布时间:</span><span class='info'>2016-10-27</span></div>

结构如图:

Paste_Image.png

为了分别控制左右两边的字体样式,我在外层div中嵌套了两个span,给他们分别加上不同的样式。

对应的css样式

.article .light-font{
    font-size:14px;
    color:#666;
}

.article .info{
    font-size:14px;
    color:#3c3a3a;
}

文章区域,我主要给里面的 P 标签加了样式:

.article .content p{
    text-indent:2em;
    margin-bottom:20px;
    font-family: 微软雅黑;
}

接下来演示一下层级关系:

Paste_Image.png
Paste_Image.png
Paste_Image.png

文章中的每一个段落,对应一个P标签,我给这些P标签加上特定的样式,包括首行缩进,底外边距,还有字体。

先这么简单弄一下吧,有个样子就行了。

至于作者信息的展示区,也是比较简单的,我就放了一个头像和作者名称。

Paste_Image.png

html

<div class='right mt32'>
    <div class='author'>
    <img src='${basePath}/static/img/1.jpg' class='header_pic' width='90' height='90'></img>
    作者:张三
    </div>
</div>

可见,头像和作者名称都是放在一个div里面的,这个div有一个叫做 right 的css属性。

Paste_Image.png

头像部分我用了一个相对定位


Paste_Image.png

最后是评论区:

Paste_Image.png
Paste_Image.png

剩下的具体评论是一个个p标签,就不一一细说了。

评论区html代码:

<!-- 评论区 -->
<div class='commentBox'>
    <textarea class="comment_input" id="commenttxt" placeholder="请输入评论信息(600)..." maxlength="600"></textarea>
          <input type="button" value="保存评论" class="button">
</div>
<div class='clearfix'></div>
<br/><hr/>
<div class='mb64' class="comment_list">
    <div class="comment_infor clearfix">
        <div style='border-bottom:1px solid #ccc' class="comment_word">
             <p style='border-bottom:20px solid #fff'>${comment.username}dwedewffrg 说:</p>
             <p class='mb32'>内容不错,感谢分享!</p>
         </div>
    </div>
</div>

2. 从主页面到详情页面的跳转问题

我们的首页会展示出不同分类的文章列表,每一篇文章都有一个封面,我们通过点击封面进入文章的详情页。

Paste_Image.png

这个时候,我们先来看看,当初是怎么把数据库里面的文章展示在首页的?

Paste_Image.png

原来,我们在index.jsp中,写过如下代码:

<% ArticleService articleService = new ArticleService(); %>

然后调用了 articleServicegetArticlesByCategoryId 方法。

<%
    //查询出编程代码类的相关文章
    List<Map<String,Object>>  articles2 = articleService.getArticlesByCategoryId(2, 0, 6);
    pageContext.setAttribute("articles2", articles2);
%>

默认查出来前六条数据。

如果没看明白的话,可以去回顾之前的章节,这里就不再赘述了。

好的,继续。

articles2 是一个list,拿到这个list之后,我们立即把它放在了pageContext里面,这样的话,我们在当前页面就能够访问到这个list了。

像这样:

<div class='category'>
    <div class='title'>编程代码类</div>
    <ul class='items'>
        <c:forEach items="${articles2}" var="item">
            <li class='item' onclick="detail('${item.id}');">
                <div class='item-banner'>
                    <div class='item-header'>${item.header}</div>
                    <div class='item-name' title = "${item.name}">${item.name}</div>
                    <div class='item-author'>@${item.author} 著</div>
                </div>
                <div class='item-description'>${item.description}</div>
            </li>
        </c:forEach>
        <div style='clear:both'></div>
    </ul>
</div>

我们要通过这个封面打开详情页,是不是需要一个点击事件呢?

因为我这边使用了onclick属性,所以我单独写了一个 detail 方法:

//打开详情页
function detail(id){
    var a = document.createElement("a");
    a.href = "detail.jsp?id=" + id; 
    console.log(a);
    a.target = '_new'; //指定在新窗口打开
    a.click();//触发打开事件
}

在detail方法里,我直接创造了一个a标签,目标地址指向了detail.jsp,并且使用get方式传递了一个参数,也就是文章的id。最后,手动触发了点击事件。

因为需要在detail.jsp中,从后台查出文章的具体内容,我们必然通过id去查。所以,我们需要给详情页传递一个id。

Paste_Image.png

我们这一章先不管怎么去后台查,先确保能把文章id传递到详情页再说。

当我们点击文章列表中的某一条数据,进入详情页的时候,会发现url地址栏就带了id。

比如:
http://localhost:8080/Article/detail.jsp?id=ddc0136f-7bf5-41ed-ba6f-462d370afbe4

点击不同的文章,后面跟的id是不同的。这样就说明id的传递已经没问题了。

好的,这一章先到这里,下一节开始写详情页的业务代码。

我要下载源码

您的支持是我写作的最大动力:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容