当前位置: 代码迷 >> Web前端 >> JavaEE 五开发指南学习(创建和部署jsp的web应用2)
  详细解决方案

JavaEE 五开发指南学习(创建和部署jsp的web应用2)

热度:880   发布时间:2012-12-24 10:43:13.0
JavaEE 5开发指南学习(创建和部署jsp的web应用2)
下面是一个使用标准操作和内置对象的例子。这个例子扩展了上一个例子,增加了一个注册页面。使用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()。