下面是一个使用标准操作和内置对象的例子。这个例子扩展了上一个例子,增加了一个注册页面。使用JavaBean,还是用内置对象request来读取请求参数。
目录结构如下:
首先创建一个JavaBean。
User.java
package com.apress.faq; public class User { private String firstName; private String surname; private String loginName; private int age; ...get,set方法 } }
然后对welcome.jsp修改,如下:
<%@ page errorPage="/WEB-INF/errorPage.jsp" import = "java.util.*,com.apress.faq.*" %> <html> <head> <title>Java FAQ Welcome page!</title> </head> <body> <% User user =(User)session.getAttribute("user"); if(user==null){ %> You are not registered!please <a href = "register.html"> Register</a> <% } else{ %> Welcome to the java FAQ. <%! FaqCategories f = new FaqCategories(); %> click a link below for answers to the given topic. <%Iterator it = f.getAllCategories(); while(it.hasNext()){ String s = (String)it.next(); %> <p> <a href="<%=replaceUnderscore(s) %>.jsp"><%=s %></a></p> <% } %> <%@ include file = "WEB-INF/footer.jspf" %> <% } %> </body> </html> <%! public String replaceUnderscore(String s){ return s.replace(' ','_'); } %>
regiter.html
<html> <head> <title>Registeration page</title> </head> <body> <form action="register.jsp" method="POST"> <table> <tr> <td align="right">First name:</td> <td align="left"><input type="text" name="firstName"></td> </tr> <tr> <td align="right">sur name:</td> <td align="left"><input type="text" name="surname"></td> </tr> <tr> <td align="right">Login name:</td> <td align="left"><input type="text" name="loginName"></td> </tr> <tr> <td align="right">Age:</td> <td align="left"><input type="text" name="firstName"></td> </tr> </table> which topic are you interested in? <br><input type="checkbox" name="topics" value="hobby">hobby</input> <br><input type="checkbox" name="topics" value="study">study</input> <br><input type="checkbox" name="topics" value="thread">thread</input> <p><input type = "submit" value="Submit" /></p> </form> </body> </html>
register.jsp
<html> <head> <title>register user!</title> </head> <body> <jsp:useBean id="user" scope="session" class="com.apress.faq.User"> <jsp:setProperty name="user" property="*" /> </jsp:useBean> welcome new user,these are the values you submited: <p>Your firstname is<%=user.getFirstName() %>.</p> <p>Your surname is<%=user.getSurname() %>.</p> <p>Your loginName is<%=user.getLoginName() %>.</p> <p>Your age is<%=user.getAge() %>.</p> You selected these topics: <% String[] topics = request.getParameterValues("topics"); if(topics==null){topics=new String[]{"No topics"};} for(int i =0;i<topics.length;i++){ %> <br><%=topics[i] %> <% } %> <p>Go to <a href="welcome.jsp">Topic List page</a></p> <%@ include file = "WEB-INF/footer.jspf" %> </body> </html>
http是无状态的协议,但是web应用可以通过使用session来保存一个客户端和服务器端的交互信息。第一次访
问一个新网页时,速度会很慢,因为服务器要进行解释和编译,如将jsp编译为servlet。servlet的目标是在
服务器中运行java代码以扩展服务器的能力。HttpServlet是运行在HTTP服务器上的Servlet。这个Servlet接
收从客户端发来的HTTP请求,并且为每个请求创建动态的响应。这个Servlet还要通过ServletContext访问应
用,通过ServletConfig对象访问Servlet的参数。
jsp是html中嵌入java代码,而servlet是java代码嵌入html,这将导致程序非常难以维护,特别是在团队中的java程序员并不擅长web开发的情况下更是如此。可以使用表达式语言(EL)、定制操作和标签库(TL)。
首先是page指令的import属性变成了import语句。
package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.util.*; import com.apress.faq.*;下面是class语句
public final class welcome_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent {
该类扩展了HttpJspBase,Web应用的Servlet扩展自HttpServlet。
接着将jsp页面中的两个声明转化为java源码中的一个变量声明和一个公共方法声明。
jsp的主要部分包含在_jspService()方法中。
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null;在servlet中与之对应的方法是service()。