八宝书库 > 文学其他电子书 > JSP入门教程(DOC格式) >

第14部分

JSP入门教程(DOC格式)-第14部分

小说: JSP入门教程(DOC格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




说一句:“太麻烦啦。”  



9。2。 关于 jstl  



taglib 太笨重,也太复杂了。编写一个 taglib 花费的力气太大,又不容易修改 

或扩展。一般情况下,taglib 都是由别人写好,我们再直接调用。sun 就为标签 

库定义了一套标准,叫做 jstl (java standard taglib)java 标准标签库,可 

以去http://jakarta。apache。org/taglibs/index。html 下载 apache 实现的 

jstl。  



想在项目里使用 jstl,首先要把 jstl。jar 和 standard。jar 两个文件放到 

/WEB…INF/lib/目录下。  



                                                                      



                                      87 / 148  


…………………………………………………………Page 88……………………………………………………………

                                       



然后在 list。jsp 中加入 jsp 指令(direction)引用 jstl 中定义的标签库。  



    



这里的 uri 是固定写法,只要写成这个就可以使用 jstl 了,jstl 中包含多个标 

签库,这里我们只用到 core。  



经过上述配置,现在可以使用 jstl 了,代码如下:  



  

    

      

        {contact。username}  

        {contact。sex}  

        {contact。email}  

        {contact。qq}  

        {contact。descn}  

        修改 

 | 删除 

  

      

  



这里使用的是 c:forEach,它也是一个执行循环的标签,var 和 items 参数的意 

义与上边谈到的 lingirl:for 标签已知,分别代表循环变量和循环数据。唯一不 

同的是多了一个varStatus 参数,这个参数表示当前行的状态,其中 

status。index 表示当前行的序号,我们就通过序号计算奇偶行。  



在 c:forEach 标签中,我们还看到一个 c:set 标签,它的作用是可以将指定的变 

量保存到作用域中,默认作用域是 page,这里我们使用 status。index 计算出行 

的奇偶性,然后保存到row 中,后面就可以直接使用{row}调用了。  



jstl 中的 c:forEach 不但可以处理 Collection,还可以处理数组和Map,使用 

jstl 我们更容易写出结构一致的代码,以初学 jsp 来说,自定义 taglib 还是太 

复杂了,所以还是先学习一些常用的 jstl 为好。  



例子在 lingo…sample/09…02 下,其中只有 list。jsp 中使用了 jstl。  



                                    88 / 148  


…………………………………………………………Page 89……………………………………………………………

                                               



                       第 10 章 综合电子留言板  



注意  



将前九章的知识结合起来,实现一个电子留言板,包括注册登录,发帖回复功能。  



如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章: 

第 11 章 文件上传。  



    1。  对电子留言板不感兴趣。  



10。1。 电子留言板用户指南  



首页显示的是主题列表。  



                                                                                                               



用户如果想发表新主题或者对主题进行回复,必须先注册为会员。  



                                                                                                               



                                           89 / 148  


…………………………………………………………Page 90……………………………………………………………

                                                                   



注册后进入登录页面进行登录。  



                                                                                                                                                               



登录后即出现在用户在线列表中。  



                                                                                                                                                               



点击标题可以看到主题的详细信息。  



                                                             90 / 148  


…………………………………………………………Page 91……………………………………………………………

                                                                    



                                                                                                                                                                 



登录以后即可发布新主题。  



                                                                                                                                                                 



10。2。 数据库设计  



数据库 er 图  



                                                              91 / 148  


…………………………………………………………Page 92……………………………………………………………

                                            



                                                                                                    



共定义了三张表:  



    1。  user 用户,保存注册用的信息。  

    2。  thread 主题,用户发起的主题帖子,外键关联 user,对应发表主题的用 

       户  

    3。  ment 回复,对主题帖子发起的回复,外键关联user 和 thread,对应 

       发表回复的用户和回复的主题。  



建表 sql 脚本放在 10…01/WEB…INF/sql/import。sql。  



…用户  

create table user(  

    id bigint; …主键  

    username varchar (100); …帐号  

    password varchar (100); …密码  

    reg_time datetime; …注册时间  

    last_login datetime …上次登录时间  

);  

…主题  

create table thread(  

    id bigint; …主题  

    title varchar (200); …标题  

    content varchar (2000); …内容  

    create_time datetime; …发帖时间  

    update_time datetime; …更新时间  



                                        92 / 148  


…………………………………………………………Page 93……………………………………………………………

                                       



    hit integer; …点击数  

    user bigint …发帖用户  

);  

…回复  

create table ment(  

    id bigint; …主题  

    content varchar (2000); …内容  

    create_time datetime; …发布时间  

    user bigint; …回复用户  

    thread bigint …回复的主题  

);   



根据数据库表建模。每张表对应三部分:domain,dao 和 servlet。domain 是简 

单的 javabean 用来封装数据表中的数据,dao 中进行对数据库的业务操作, 

servlet 作为控制器处理请求调用 dao 和 domain 实现业务功能。  



为了便于管理,将使用到的类分成四个包,domain,dao,utils 和 web。domain;  

dao; web 中分别包含 domain; dao 和 servlet 类,utils 包中是数据库连接工具 

和过滤器。  



                                                              



这里的 domain 和 dao 都是按照理想状态编写的,将数据库表中的字段对应到 

domain 类中,然后 dao 提供 CRUD 功能,不过 dao 中的有些功能并没有用到,比 

如 update 和 remove。  



10。3。 功能设计  



整个在线留言板可分为两大功能部分:用户管理与主题回复管理。  



10。3。1。 用户管理  



用户管理功能包括:新用户注册,用户登录,用户注销。用户登录的时候顺便带 

上一个用户在线列表。  



这部分的页面主要在 security 目录下,操作代码都放在 

anni。web。UserServlet。java 和对应的 anni。domain。User,anni。dao。UserDao 

中。  



                                    93 / 148  


…………………………………………………………Page 94……………………………………………………………

                                      



1。  新用户注册  



   这是 CRUD 中的 create,向用户表中添加一条新信息,我们只在前台页面 

   中使用 javascript 进行数据校验,要求用户输入用户名,密码,并且在 

   两次密码输入相同的时候才能提交。  



   提交的请求交由 UserServlet 的register()方法处理。  



   /**  

    * 注册新用户。  

    */  

   public void register(HttpServletRequest  

   request;HttpServletResponse response) throws Exception {  

       String username = request。getParameter(〃username〃);  

       String password = request。getParameter(〃password〃);  

       String confirmPassword =  

   request。getParameter(〃confirmPassword〃);  

     

       boolean userExists = userDao。checkExists(username);  

       if  (userExists) {  

           request。setAttribute(〃error〃; 〃用户名:〃 + username + 〃 

   已被使用了,请更换其他用户名注册。〃);  

            

   request。getRequestDispatcher(〃/security/register。jsp〃)。forward( 

   request; response);  

       } else  {  

           User user = new User();  

           user。setUsername(username);  

           user。setPassword(password);  

     

           userDao。save(user);  

           response。sendRedirect (request。getContextPath() +  

   〃/security/registerSuccess。jsp〃);  

       }  

   }       



   获得用户名和密码后,先通过 userDao。checkExists()检测数据库中是否 

   已经有了同名的用户,如果用户名重复,就跳转到 

   /security/register。jsp 显示错误信息。如果用户名没有重复,则将此 

   用户信息添加入库,然后页面重定向到/security/registerSuccess。jsp 

   显示注册成功信息。  



                                  94 / 148  


…………………………………………………………Page 95……………………………………………………………

                                       



    保存信息之后使用 redirect 是个避免重复提交的简易方法,如果使用 

    forward,浏览器上的url 不会改变,用户刷新页面就会导致重复提交信 

    息。  



2。  用户登录与注销  



    登录与注销的流程与之前介绍的大体相同。第 4。2 节 “例子:在线列表”  



   /**  

    * 登录。  

    */  

   public void login(HttpServletRequest request;HttpServletResponse  

   response) throws Exception {  

       String username = request。getParameter(〃username〃);  

       String password = request。getParameter(〃password〃);  

     

       User user = userDao。login(username; password);  

       if  (user != null) {  

           user。setLastLogin(new Date());  

           userDao。update(user);  

           HttpSession session = request。getSession();  

           session。setAttribute(〃user〃; user);  

     

           // 加入在线列表  

           session。setAttribute(〃onlineUserBindingListener〃; new  

   OnlineUserBindingListener(username));  

     

           response。sendRedirect(request。getContextPath() +  

    〃/security/loginSuccess。jsp〃);  

       } else  {  

           request。setAttribute(〃error〃; 〃用户名或密码错误!〃);  

            

   request。getRequestDispatcher(〃/security/login。jsp〃)。forward(req 

   uest

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的