项目简要说明
首先我们会开发一个待办事项清单的应用,很明显,这种应用非常简单,最开始仅仅是一个字符串组成的列表,因此很容易得到一个最简单的应用,满足我们小小的虚荣心,但是,它却又是一个很好的例子,因为它很容易扩展更加强大的功能,如持久层模型,最后期限,提醒,分享,乃至移动端,微信端等等,并且我们还可以不必只局限于列出待办事项,还可以于其他的功能进行整合,如事项记账,事项组队等.
注意:这种方式如果仅仅作为blog的demo当然无可厚非,但是,严禁用到实际的项目中,毕竟项目的镀金和范围蔓延无论如何都是一个项目 想要成功的大忌!!!
请求与响应
在上一章中,我们完成了一个极简单的应用,没有任何交互,没有任何操作,仅仅是显示输出了一个Hello world的文字,但是,这样一个简单的页面,也能简单的说明BS架构的一些基本原理–即依靠Http协议基于的请求/响应范式进行交互。
那么问题来了,什么叫做请求/响应范式?
在小时候我们应该都玩过,面向一座大山,或是一堵高墙大声的喊出:“世界和平!”然后等待对面传来的回声。这个时候,就可以把它理解为一个请求/响应模型,我们就是一个浏览器,面向着山崖喊出一个声音(发出一个请求),作为服务端的山崖,经过处理(凹凸不平的表面会对声音做一些变声)后返回一个回声(响应),而我们显然不会与山崖有着除了声音之外的任何直接交互。
同时,我们也能了解到,若我们对着山崖喊出两次,那么这两次之间是没有任何的生意,而且两次回声的内容也不会有直接的联系,完全取决于我们喊的内容,所以,由此我们可以得出http(不考虑协议新版本的长连接内容)协议的一些重要特性:
- 服务端只能被动的响应客户端的请求
- 请求响应完成后,就会关闭服务器浏览器之间的网络连接
- 不同的请求响应之间,没有直接的联系
服务器还是客户端
由于jsp是在Html中嵌入逻辑代码,所以很容易有一种jsp运行在客户端的幻觉,但这仅仅是幻觉,重点强调一下,jsp只负责服务器端的部分,浏览器上的任何东西,包括弹框,动画,客户端校验等等,均与jsp无关,jsp不会也不想知道,如果你非想要jsp知道?那好吧,发送一个请求。
请求(request)
前边说了那么多的请求,下面我们首先看一下在jsp中封装的请求是什么?
注意,这里仅仅是为了学习演示,有一些代码是严禁在工作中使用的,并且在后续的章节中可能会删除。
前一篇的例子有些太过简陋,无论如何访问,都是仅仅显示一个hello world,除此之外还不能做任何事,下面我们就把他改造成一个实际的todos程序,首先修改index.jsp,修好后的用户输入部分会这样:
<form action="index.jsp" method="post">
<input type="text" name="todo">
<input type="submit" value="ok">
</form>
一个非常简单的表单,提交到本页面,并且只提交一个名字叫todo的文本框。
然后,在表单的下边接收这个文本框:
Todo: <%=request.getParameter("todo")%>
这个看上去更加的简单,注意一下前边的=以及后边没有分号,运行一下,显示结果为:
在文本框中输入下午三点来读书,点击ok,测试一下结果:
完美显示,但现在还有两个问题,第一个是刚刚但是刚刚进入页面是显示的null是怎么回事?第二个则是为什么我要输入英文,难道是卖弄英语么?下面就分别来解答这两个问题:
第一个出现的null是java中做常见的空指针异常,原因是第一次进入的时候,请求,即request中找不到todo参数,所以只能返回一个空值,为了不显示这个值,我们对输出的部分进行一下改造:
<%
if(request.getParameter("todo")!=null){
out.print("Todo:"+request.getParameter("todo"));
}
%>
注意开始的部分没有了=,而语句结束后增加的;
然后查看一下效果
此时不在线上null,然后继续输入下午三点来读书:
效果和之前一样
下面来说明第二个问题,作为一个英语渣,当然不是卖弄英语,那么输入中文会有什么效果呢?测试一下就可以了:
这是什么东东?
答:这个就是鼎鼎大名的中文乱码问题,这个问题产生的原因简单说就是不同的编码格式互相不同解析产生的,比如说utf-8编码和gb2312编码以及其他的编码中,中文字符无论是值还是长度都不一样,而浏览器又不知道编码,所以就随便找一个喽(实际当然不是随便找的,是根据国际化默认值的),所以,解决问题的方法也很简单,告诉他们统一用一种编码就可以了:
1 响应中添加编码信息(utf-8):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 给请求设置编码信息(注意,要在jsp中代码行的最前):
request.setCharacterEncoding("utf-8");
3 指定html的编码格式
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
在重启进行一下测试:
ok,问题解决。
好着,试着运行几次,我想你一定会跳起来说:骗子,这个根本就不是todos,明明就是一个简单的输入显示功能,他连显示多条记录的功能都没有!嗯,这个确实,但留到下一次来解决。