>
<a href="/pathname/">Maintaining State for HTML Form Buttons</a> by Matthias Laux <br>Here's the scoop on using JavaServer Pages custom tags to maintain button state in your HTML forms. <i>(October 2002)</i>
</p>
相反,下面这个例子在“Laux”和“Here’s”之间使用了回车,以确保源文件更加易于理解。
<
>
<a href="/pathname/">Maintaining State for HTML Form Buttons</a> by Matthias Laux
<br>Here's the scoop on using JavaServer Pages custom tags to maintain button state in your HTML forms. <i>(October 2002)</i>
</p>
为什么没有返回格式?
如果你像上面的第一个例子那样不考虑漏掉用于格式化的回车符,那么JSP代码将读取整行数据,分析其中是否有关键词出现,如果有匹配存在,则在结果页面中返回整行。在第二个例子中,JSP代码读取“Laux”之上的行,然后进行分析,如果有匹配就在结果页面中返回该行。这段代码接下来读取以“Here’s”开始的下一行。
简而言之,由于整个页面被打乱了,因此并没有完全返回整个页面。在上面的例子中,如果搜索条件是“Maintaining”,结果只会返回标题和作者而没有简介;如果搜索条件是“maintain”,结果将返回简介而不是标题和作者。
代码分析
本节对findwords.jsp的每一部分分别进行介绍,findwords.jsp是当用户点击Go按钮时调用的JSP代码。
注意: 源代码在一个txt文件中,因此你可以将其当作文本来浏览。以“jsp”为后缀意味着web服务器需要将该文件编译成一个servlet并且执行它。
JSP看上去就像一个HTML网页,只不过其中通过JSP标签嵌入了servlet代码片段。有许多不同类型的JSP标签,在本小节只涉及了其中的一部分。
指令
JSP指令用<%@ and %>指令标签来包含,当JSP网页被转换为servlet时由JSP引擎处理。 本例中的页面指令告诉JSP引擎脚本语言是Java(language="java"),并且需要包含指定的Java包。
声明
JSP声明由<%! and %>声明标签包含,允许你设置变量以便稍后在程序中使用。你也可以在使用的时候声明变量。只是要记住无论变量在哪里声明,其作用域都是整个JSP页面。本例中的声明声明了一个随机访问文件和一些用于读取搜索页的字符串变量。
设置文件和变量
代码的下一行初始化变量,并且打开一个到searchpage.html的连接,searchpage.html是将要搜索的网页。在这个例子中,该文件是JavaServer Pages Technology索引页面的一份拷贝。这个初始化过程获得要搜索的文件的长度,得到该文件的第一行,并且将一些变量设为0或空值。
val变量是一个标志,用于指示一个匹配是否是其类别中的第一个,并且由此判断是必须重新建立一个匹配序列,还是在已有的序列上继续搜索。
results变量也是一个标志变量,用于指示是否找到匹配。如果没有任何匹配,则在返回页上向用户返回一个消息。
File inputFile = new File("/pathname/searchpage.html");
in = new RandomAccessFile(inputFile, "r");
long length = in.length();
s = in.readLine();
int val = 0;
int results = 0;
String[] qpValues = null;
String qtValue = null;
结果页和记录条目
接下来的代码用于打印结果网页的标题,检查从可选序列得到的选择值(getParameterValues("qp"))和从表单上的输入域得到的值(getParameter("qt"))。找到的所有值都会被检索,并用于创建在结果页顶部显示的项目列表索引。
out.println("<h4>Keyword Search Results</h4>");
out.println("<ul>");
for(int j = 0; j < qpValues.length; j ) {
out.println("<li><a href=#" qpValues[j] ">"
qpValues[j] "</a>");
}
}
if(request.getParameter("qt") != null) {
qtValue=request.getParameter("qt");
if(qtValue.length() > 0) {
out.println("<li><a href=#" qtValue ">"
qtValue "</a>");
}
}
out.println("</ul>");
大小写和从文件中读取
检索到的任何选项值都使用它在表单中输入的原始大小写,从而与文件中读到的行的字符进行匹配,并且还被全部转换为小写来进行比较。这是为了捕捉该条目中的所有可能性。例如,“Properties”使用大写的“P”与searchpage.html 中的每行进行一次比较,使用小写“p”也做一次。这样同时满足了“properties”在一个句子的开头和在中间的情况。从输入域得到的值则只使用输入的精确值,或者全大写、或者全小写,或者是输入状态。
每行开头和结尾的空格自动去掉,并且每行都检查是否以“<A HREF”开始。searchpage.html文件的每一行都是用左对齐,但是当一行以空格或tab开头时,去掉空格的操作可以解决可能错误地输入到关键词前面的空格或者制表键的问题。文件中我们感兴趣的所有行都是以“<A HREF” 开头的,而这在另一个文件中理所当然是必然会改变的,例如对以“<li”开头的行感兴趣,或其他的一些什么。
选项值:寻找匹配
这段代码的主要部分将选项值和从searchpage.html读到的行进行比较以便寻找匹配。当寻找到匹配时,将该行在其正确的类别下作为一个项目列表项返回到结果页面。
if(request.getParameterValues("qp") != null) {
qpValues = request.getParameterValues("qp");
for (int i = 0; i < qpValues.length; i ) {
while(s!=null) {
if(s != null && s.length() > 0 ) {
if(s.trim().startsWith("<A HREF")
&& qpValues.length() > 0) {
String lower = qpValues.toLowerCase();
if(s.indexOf(qpValues) > 0
|| s.indexOf(lower) > 0) {
results=1;
if(val == 0) {
out.println("<a name=" qpValues "></a>");
out.println("<h4>");
out.println(qpValues);
out.println("</h4>");
out.println("<ul>");
val=1;
}
out.println(s);
out.println("<p>");
}<
| 欢迎光临 江西广告网 (http://bbs.jxadw.com/) | Powered by Discuz! X3.2 |