现要做一个简单的登录页面,如果用户通过验证,会显示Welcome用户名的欢迎词,反之则返回登录页面让用户再次输入

这部分的完整代码是JSPDemo项目里的login.jsp,下面来分析一下关键代码。

代码位置

视频位置

code/第3章/JSPDemo

视频/第3章/JSP案例的讲解

根据JSP的语法,可以通过@import来导入需要的jar包。这里需要导入支持MySQL的库文件,这部分的代码如下所示。

1     <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

2   <%@ page import="java.sql.*"%>

3   <%@ page import="com.mysql.jdbc.Driver" %>

JSP相当于在HTML页面加上Java代码,一般在<body>标签里放入主要代码。

首先来分析一下业务,当进入这个页面的时候,需要判断是否有用户名和密码信息输入,以此来做不同的动作,所以在开始部分,需要用一个内嵌对象request来完成这个功能,主要代码如下。

4     <body>

5   <%

6        if(request.getParameter("username") == null)

7        {

8    %>

9   <form method="post" action="login.jsp" name="userInfo" id="userInfo">

10  <table>

11       <tr>

12           <td>User Name</td>

13           <td><input type="text" name="username" id="username" /></td>

14       </tr>

15       <tr>

16           <td>Password </td>

17           <td><input type="password" name="password" id="password" /></td>

18       </tr>

19       <tr>

20           <td colospan="2" align="center">

21  <input type="submit" name="logon" value="Login" />&nbsp;&nbsp;

22       <input type="reset" name="reset" value="Reset" />

23           </td>

24       </tr>

25  </table>

26  </form>

我们看到,在JSP里是用<%...%>把Java代码包含起来的,这里用request.getParameter来读取是否有username这个信息。request是个内嵌对象,可以不用定义就能直接使用,这里用到它的获取参数的方法。

在JSP里有不少内嵌对象,在项目里经常用到的是request、response、Session、out等,关于内嵌对象的知识大家不用硬记,可以在用到的时候查现成的API。

一旦发现没有用户名的信息输入,那么就需要用一个HTML的form来显示供用户输入的窗口。

如果request.getParameter("username")不是null,即用户已经输入了用户名,那么就需要获取用户名和密码信息,并到数据库进行验证,代码如下所示。

27   <%

28      }

29      else

30      {

31          String username = request.getParameter("username").toString();

32          String pwd = "";

33          if(request.getParameter("password") != null)

34          {

35              pwd = request.getParameter("password").toString();

36          }

37          //connect to DB

38          Class.forName("com.mysql.jdbc.Driver");

39       Connection connection = null;

40       connection = DriverManager.getConnection(

41                   "jdbc:mysql://localhost:3306/book", "root", "123456");

42          String sql = "select username from users where UserName = ?and Pwd = ?";

43       PreparedStatement pst = connection.prepareStatement(sql);

44       pst.setString(1, username);

45       pst.setString(2, pwd);

46           ResultSet rs=pst.executeQuery();

47       //can login

48       if(rs.next())

49       {

50  %>

51          Welcome,<%= rs.getString("username") %>

从上述代码中的第31和35行得到了用户名和密码之后,用第38行的Class.forName载入了JDBC的驱动程序,然后在第43行定义了一个PreparedStatement来执行SQL语句,并在第46行用一个ResultSet来接收运行结果。

请大家注意,这里用到的PreparedStatement是为了避免SQL注入,这部分的知识点大家可以看本书的数据库相关的内容。

一旦通过第48行的if语句判断rs.next()有返回对象,那么就需要先在第50行用%>结束Java部分的JDBC访问数据库的代码,随后在第51行显示Welcome的字样。这里能看到JSP的另外一个语法,用<%=%>来显示变量的结果。

如果第48行里rs.next没有返回,也就是说,在数据库里找不到匹配的用户信息,那么就需要返回到登录页面,让用户再次输入登录信息,这部分的代码如下。

52   <%

53       }

54       else

55       {

56  %>

57  <form method="post" action="login.jsp" name="userInfo" id="userInfo">

58  <table>

59       <tr>

60           <td>User Name</td>

61           <td><input type="text" name="username" id="username" /></td>

62       </tr>

63       <tr>

64           <td>Password </td>

65           <td><input type="password" name="password" id="password" /></td>

66       </tr>

67       <tr>

68           <td colospan="2" align="center">

69  <input type="submit" name="logon" value="Login" />&nbsp;&nbsp;

70           <input type="reset" name="reset" value="Reset" />

71           </td>

72       </tr>

73  </table>

74  </form>

75  <%

76       }

77      }

78  %>

79  </body>

80  </html>

这里其实是代码复制,又写了一遍提供用户名和密码输入的form。

JSP的语法不算简单,但大家可以有选择性地了解,从而把学习时间用到更重要的知识点(比如框架思想、优化思想)的学习上。

在上述代码给出的例子中,能看到如下的缺陷:

①出现了代码复制,把供用户输入的form复制了两次。

②频繁地切换JSP和HTML的逻辑,导致阅读上和开发上的困扰,日后如果别人来维护这部分代码,会很困难。

刚开始开发的时候这种缺陷还不明显,当深入开发的时候,这种缺陷就会爆发。

①修改点一:我们需要调整供用户验证身份的Form代码,加入验证码的输入框。

我们不得不修改两个重复且相同的代码,这样不仅会增加工作量,而且一个疏忽就会导致忘记修改其中一个,增加代码维护的难度。

②修改点二:要改成Oracle数据库,而且数据表名和字段都变了。

我们不仅需要修改JDBC的代码,而且还要修改Welcome xxx这部分的显示代码,也就是说,数据库方面的修改会直接牵涉其他类型的业务代码。

③修改点三:需要实现“三次验证不过就要锁用户”功能。

我们需要在JDBC部分的代码计数,如果登录次数小于3,那么就需要重复性地复制Form的代码。如果超过三次,则还需要在Java代码里夹杂一个“提示锁屏”的显示页面,这会导致JSP更加混乱。

不是危言耸听,我们见过不少页面数量小于10的小项目,开发人员为了省事,直接在JSP里放入所有的功能,就像前面给出的例子一样,交货两三个月后,当完成用户提出若干改进意见后,这些个JSP代码就变得像天书一样,阅读性很差。

在提面试问题的时候,如果发现候选人使用“大而全”的开发方式,我们会让面试者说出理由,如果理由类似“项目紧,缺人手,权衡下来宁可牺牲代码的质量”,那么说明面试者至少和MVC开发模式比较过,可以接受。如果面试者直接不知道MVC的开发模式,甚至不知道“大而全”的缺点,那么我们的评价至少是“没架构意识”。

如何改进?分解业务,用分层的方式来分解不同类型的业务。

具体来说,在JSP页面里,剥离与显示无关的代码,一个好的JSP页面里,应该少见甚至不用<%%>包含起来的Java代码。

Java web开发,在一个jsp里放太多java代码的后果,摘自 java web轻量级开发面试教程的更多相关文章

  1. Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程

    本文来是从 java web轻量级开发面试教程从摘录的. Inverse的英文含义是反转,在Hibernate中用来决定是由哪方来维护两个业务实体类之间的关联关系,具体而言,就是由哪方去设置这个被外键 ...

  2. JSP里的c:url中的/代表站点根目录还是WEB根目录?(待解答)

    <c:url/>使用格式: <c:url var="<string>" scope="<string>" value= ...

  3. java.io.IOException: Error: JSP Buffer overflow

    错误 jsp页面报错如下: Stacktrace: org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java ...

  4. 面试技巧,如何通过索引说数据库优化能力,内容来自Java web轻量级开发面试教程

    上星期写了一个篇文章,数据库方面的面试技巧,如何从建表方面展示自己能力,承蒙管理员抬举,放入首页,也承蒙各位厚爱,两天内收获了将近770个点击,也一度进入48小时热榜. 为了感谢管理员和大家的支持,再 ...

  5. 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)

    前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻 ...

  6. web开发(五) JSP详解(四大作用域九大内置对象等)

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6427759.html>,在此仅供学习参考之用. 一.JS ...

  7. Java Web基础:JSP基础概念

    JSP介绍 JSP全称是Java Server Pages,它和Servlet都是Sun公司定义的用于开发动态Web资源的技术,它解决了Servlet输出流排版复杂和难以维护的问题.JSP完美融合了H ...

  8. 如何用比较快速的方法掌握Spring的核心——依赖注入,Java web轻量级开发面试教程 读书笔记

    我们知道,Java方面的高级程序员一定得掌握Spring的技能,其中包括Spring 依赖注入(IOC),面向切面(AOP),和数据库的整合(比如和Hibernate整合或声明式事务等)以及Sprin ...

  9. 根据实践经验,讲述些学习Java web能少走的弯路,内容摘自java web轻量级开发面试教程

    在和不少比较上进的初级程序员打交道的过程中,我们总结出了一些能帮到合格程序员尽快进阶的经验,从总体上来讲,多学.多实践不吃亏.本文来是从 java web轻量级开发面试教程从摘录的. 1  哪些知识点 ...

随机推荐

  1. Android - 自定义控件之圆形控件

    自定义控件 - 圈圈 Android L: Android Studio 效果:能够自定义圆圈半径和位置:设定点击效果:改变背景颜色 下面是demo图 点击前: 点击后: 自定义控件一般要继承View ...

  2. OI内的排列与组合(简单版)

    §1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...

  3. Openfire3.9.1+jdk1.7导入到eclipse中

    Openfire3.9.1+jdk1.7导入到eclipse中 写这篇文章,也是记录一下自己几晚上的辛苦,因为作为新手在网上看了很多的资料,但是按照他们的我总是出不来,跟他们描述的不一致,可能是环境问 ...

  4. Java条件查询涉及到时分秒

    关于Oralce数据库 的日期时间查询: 下面我们先来看一组日期数据 表:myDate 列:time; 1998-8-7 23:45:33.3 1998-8-7 11:22:21.5 1998-8-7 ...

  5. Memcached的基础梳理

    1 .Memcached 概念 官方解释如下: What is Memcached? Free & open source, high-performance, distributed mem ...

  6. 读书笔记_MVC__关于通过js构建ORM,实现Model层

    最近一直在学习MVC构建富应用的WEB程序,自己一直对MVC的设计模式理解的不是十分透彻,终于在研读了github上Spine的源码之后,对构建Model层有了一点自己的理解. 本文仅为个人理解,如有 ...

  7. Infer 在 Mac 上的安装和环境配置

    Infer 在 Mac 上的安装和环境配置 Infer 介绍 Infer 是一个静态分析工具.Infer 可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题. 任何人都可以使 ...

  8. Flunetd 用于统一日志记录层的开源数据收集器

    传统的日志查看方式 使用fluentd之后 一.介绍 Fluentd是一个开源的数据收集器,可以统一对数据收集和消费,以便更好地使用和理解数据. 几大特色: 使用JSON统一记录 简单灵活可插拔架构 ...

  9. 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)

    上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...

  10. Java设计模式汇总

    Java设计模式汇总 设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式. ...