Resin中JSP的範例

來源:互聯網
上載者:User
js By Scott Ferguson
Blueski編譯

目錄如下:
1 引論
2 範例的架構: Hello, World
3 Servlet 評論
4 展示留言本
5 留言本的模式
6 作為應用屬性的留言本
7 留言本的邏輯
8 結論


1 引論

JSP的強大優勢在於把一種應用的商務邏輯和它的介紹分離開來。用 Smalltalk的物件導向的術語來說, JSP鼓勵MVC(model-view-controller)的web應用。JSP的classes 或 beans 是模型, JSP 是這個視圖, 而Servlet是控制器。

這個例子是一個簡單的留言本,包括使用者登入和留言。它被作為Resin平台的示範:
--執行角色
--模型 A 留言本
--用於新使用者的login.jsp
--用於登入使用者的add.jsp
--控制器 GuestJsp, 一個用來管理狀態的servlet


2 樣板的架構: Hello, World

GuestJsp servlet的架構把 "Hello, World" 這個字串傳給login.jsp頁面。這個架構為留言本設立結構。具體細節將在下面補充。

這個例子被編譯後可以瀏覽到:

http://localhost:8080/servlet/jsp.GuestJsp

你可以看到頁面上有這樣的顯示: Hello, world

JSP模板是以Servlet的處理開始然後把處理結果傳給JSP頁進行格式化。

以下使用了一個Servlet2.1 ServletContext的特性 getRequestDispatcher()。
請求的調度器在伺服器上讓servlets直接向前傳送並包括了任何可能的子請求。對SSI包含來說這是一個更靈活的取代做法。
在servlet檔案中請求的調度器可以包含任何頁面,servlet,或JSP的結果。 GuestJsp將使用dispatcher.forward()來將控制傳給JSP頁進行格式化。

GuestJsp.java: Skeleton package jsp.GuestJsp;

import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

/**
* GuestJsp is a servlet controlling user
* interaction with the guest book.
*/
public class GuestJsp extends HttpServlet {
/**
* doGet handles GET requests
*/
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
// Save the message in the request for login.jsp
req.setAttribute("message", "Hello, world");

// get the application object
ServletContext app = getServletContext();

// select login.jsp as the template
RequestDispatcher disp;
disp = app.getRequestDispatcher("login.jsp");

// forward the request to the template
disp.forward(req, res);
}
}


servlet和jsp頁使用HttpRequest對象中的屬性進行通訊。skeleton在"message"屬性中儲存了"Hello, World"。
當login.jsp啟動時,它將捕捉到該字串並將其列印出來。

由於Resin的JavaScript能夠讀取擴充的Bean模型,它可以將request.getAttribute("message")轉換成為
JavaScript的對應物 request.attribute.message。

login.jsp: Skeleton <%@ page language=javascript %>

<head>
<title><%= request.attribute.message %></title>
</head>

<body bgcolor='white'>
<h1><%= request.attribute.message %></h1>
</body>

3 Servlet的複習

對於來自於ASP或CGI背景並轉向jsp的人來說,
Servlets代替CGI指令碼體現了Java在動態類載入方面的優勢。servlet就是一個Java類,
它對Servlet或HttpServlet進行了擴充並放置到適當的路徑中。Resin將自動載入servlet並執行它。

url /servlet/classname將request提交給Servlet請求器。請求器會從doc/WEB-INF/classes自動載入Java類的類名
並試圖執行Servlet的service方法。

Resin將定期檢查類檔案以判斷是否被修改過。如果被修改過,則將用新的servlet取代舊的。

4 顯示留言本

在基本架構已經運行後, 下一步是建立model。

5 留言本模型

留言本是很直接的,這裡知識包含了一下API。它遵從Bean模型以簡化JavaScript。
同樣的API可以工作於HashMap, 基於檔案,以及資料庫應用。

JSP檔案只能存取public方法。所以JSP檔案無法建立一個新的留言本或者增加一個新使用者。
這是GuestJsp servlet的責任。

jsp.Guest.java API package jsp;

public class Guest {
Guest();
public String getName();
public String getComment();
}


Resin的JavaScript能讀取Bean模型。所以使用JavaScript的JSP頁面可以存取getName()和getComment()
作為屬性。例如,你可以簡化使用guest.name和guest.comment。

jsp.GuestBook.java API package jsp;

public class GuestBook {
GuestBook();
void addGuest(String name, String comment);
public Iterator iterator();
}


Resin的JavaScript同樣可以讀取iterator()調用,所以你可以使用JavaScript用於 ... 任何一個來取得使用者:

for (var guest in guestBook) {
...
}



GuestBook作為application屬性
為了使得例子保持簡單,GuestJsp在application (ServletContext)中存取GuestBook。作為例子,
在application中儲存資料是可以接受的,但對於完全成熟的應用,最好僅使用application將資料放到其它地方。

jsp.GuestJsp.java // get the application object
ServletContext app = getServletContext();

GuestBook guestBook;

// The guestBook is stored in the application
synchronized (app) {
guestBook = (GuestBook) app.getAttribute("guest_book");

// If it doesn't exist, create it.
if (guestBook == null) {
guestBook = new GuestBook();
guestBook.addGuest("Harry Potter", "Griffindor rules");
guestBook.addGuest("Draco Malfoy", "Slytherin rules");
app.setAttribute("guest_book", guestBook);
}
}

RequestDispatcher disp;
disp = app.getRequestDispatcher("login.jsp");

// synchronize the Application so the JSP file
// doesn't need to worry about threading
synchronized (app) {
disp.forward(req, res);
}


JSP檔案本身是簡單的。它從application擷取留言本並在表中顯示內容。通常,
application對象需要同步,因為一些用戶端可能同時瀏同一頁面。
GuestJsp在jsp檔案被調用之前小心處理了同步情況。

login.jsp: Display Guest Book <%@ page language=javascript %>

<head>
<title>Hogwarts Guest Book</title>
</head>

<body bgcolor='white'>

<h1>Hogwarts Guest Book</h1>
<table>
<tr><td width='25%'><em>Name</em><td><em>Comment</em>
<%
var guestBook = application.attribute.guest_book

for (var guest in guestBook) {
out.writeln("<tr><td>" + guest.name + "<td>" + guest.comment);
}
%>
</table>

</body>


Hogwarts Guest Book
Name Comment
Harry Potter Griffindor Rules
Draco Malfoy Slytherin Rules


6 留言本的規則(logic)--作為應用屬性的留言本

留言本的規則是很簡單的。如果使用者沒有登入,他會看到一個提示和登入表。
登入後他會看到提示並在一個表中加入留言。 login.jsp給出了登入的頁面,add.jsp給出了
增加流言的頁面。

GuestJsp在session變數中儲存了規則資訊。

執行'login'來登入或 'add'來增加留言。 其中
name: 使用者名稱
password: 口令
comment:留言

7 留言本規則 ...

// name from the session
String sessionName = session.getValue("name");

// action from the forms
String action = request.getParameter("action");

// name from the login.jsp form
String userName = request.getParameter("name");

// password from the login.jsp form
String password = request.getParameter("password");

// comment from the add.jsp form
String comment = request.getParameter("comment");

// login stores the user in the session
if (action != null && action.equals("login") &&
userName != null &&
password != null && password.equals("quidditch")) {
session.putValue("name", userName);
}

// adds a new guest
if (action != null && action.equals("add") &&
sessionName != null &&
comment != null) {
guestBook.addGuest(sessionName, comment);
}

String template;
// if not logged in, use login.jsp
if (session.getValue("name") == null)
template = "login.jsp";
// if logged in, use add.jsp
else
template = "add.jsp";

RequestDispatcher disp;
disp = app.getRequestDispatcher(template);

...


login.jsp和add.jsp僅加上了不同forms在前一個section中顯示代碼。

login.jsp <%@ page language=javascript %>
<head>
<title>Hogwarts Guest Book: Login</title>
</head>
<body bgcolor='white'>

<h1>Hogwarts Guest Book</h1>
<table>
<tr><td width='25%'><em>Name</em><td><em>Comment</em>
<%
var guestBook = application.attribute.guest_book

for (var guest in guestBook) {
out.writeln("<tr><td>" + guest.name + "<td>" + guest.comment);
}
%>
</table>
<hr>

<form action='GuestJsp' method='post'>
<input type=hidden name='action' value='login'>
<table>
<tr><td>Name:<td><input name='Name'>
<tr><td>Password:<td><input name='Password' type='password'>
<tr><td><input type=submit value='Login'>
</table>
</form>
</body>


8 結論

Resin樣本示範了擴充留言本的一些方法,包括加入一些智能的東西用於form處理。然而,由於forms取得更多的只能,即使是JSP模板也變得複雜化了。
有一個結論:XTP模板。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.