⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0088.htm

📁 精通struts源码,孙卫琴.经过更新后的,请查收,
💻 HTM
字号:
<html>

<head>
<title>新时代软件教程:操作系统 主页制作 服务器 设计软件 网络技术 编程语言 文字编辑</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋体}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1  {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
    <p align="center"><big><strong>Resin中JSP的范例</strong></big></p>

<div align="right">(文/Scott Ferguson 编译/Blueski)</div>

<br>
目录如下:<br>
1 引论 <br>
2 范例的框架: Hello, World <br>
3 Servlet 评论 <br>
4 展示留言本 <br>
5 留言本的模式 <br>
6 作为应用属性的留言本<br>
7 留言本的逻辑 <br>
8 结论 <br>
<br>
<br>
1 引论 <br>
<br>
JSP的强大优势在于把一种应用的商务逻辑和它的介绍分离开来。用 Smalltalk的面向对象的术语来说, JSP鼓励MVC(model-view-controller)的web应用。JSP的classes 或 beans 是模型, JSP 是这个视图, 而Servlet是控制器。 <br>
<br>
这个例子是一个简单的留言本,包括用户登录和留言。它被作为Resin平台的示范:<br>
--执行角色<br>
--模型 A 留言本 <br>
--用于新用户的login.jsp<br>
--用于已注册用户的add.jsp <br>
--控制器 GuestJsp, 一个用来管理状态的servlet <br>
<br>
<br>
2 样板的框架: Hello, World <br>
<br>
GuestJsp servlet的框架把 &quot;Hello, World&quot; 这个字符串传给login.jsp页面。这个框架为留言本设立结构。具体细节将在下面补充。 <br>
<br>
这个例子被编译后可以浏览到:<br>
<br>
http://localhost:8080/servlet/jsp.GuestJsp <br>
<br>
你可以看到页面上有这样的显示: Hello, world <br>
<br>
JSP模板是以Servlet的处理开始然后把处理结果传给JSP页进行格式化。 <br>
<br>
以下使用了一个Servlet2.1 ServletContext的特性 getRequestDispatcher()。<br>
请求的调度器在服务器上让servlets直接向前传送并包括了任何可能的子请求。对SSI包含来说这是一个更灵活的取代做法。<br>
在servlet文件中请求的调度器可以包含任何页面,servlet,或JSP的结果。 GuestJsp将使用dispatcher.forward()来将控制传给JSP页进行格式化。 <br>
<br>
GuestJsp.java: Skeleton package jsp.GuestJsp;<br>
<br>
import java.io.*;<br>
import java.util.*;<br>
<br>
import javax.servlet.*;<br>
import javax.servlet.http.*;<br>
<br>
/**<br>
* GuestJsp is a servlet controlling user<br>
* interaction with the guest book.<br>
*/<br>
public class GuestJsp extends HttpServlet {<br>
/**<br>
* doGet handles GET requests<br>
*/<br>
public void doGet(HttpServletRequest req,<br>
HttpServletResponse res)<br>
throws ServletException, IOException<br>
{<br>
// Save the message in the request for login.jsp<br>
req.setAttribute(&quot;message&quot;, &quot;Hello, world&quot;);<br>
<br>
// get the application object<br>
ServletContext app = getServletContext();<br>
<br>
// select login.jsp as the template<br>
RequestDispatcher disp;<br>
disp = app.getRequestDispatcher(&quot;login.jsp&quot;);<br>
<br>
// forward the request to the template<br>
disp.forward(req, res);<br>
}<br>
}<br>
<br>
<br>
servlet和jsp页使用HttpRequest对象中的属性进行通信。skeleton在&quot;message&quot;属性中保存了&quot;Hello, World&quot;。<br>
当login.jsp启动时,它将捕捉到该字符串并将其打印出来。 <br>
<br>
由于Resin的JavaScript能够读取扩充的Bean模型,它可以将request.getAttribute(&quot;message&quot;)转换成为<br>
JavaScript的对应物 request.attribute.message。 <br>
<br>
login.jsp: Skeleton &lt;%@ page language=javascript %&gt;<br>
<br>
&lt;head&gt;<br>
&lt;title&gt;&lt;%= request.attribute.message %&gt;&lt;/title&gt;<br>
&lt;/head&gt;<br>
<br>
&lt;body bgcolor='white'&gt;<br>
&lt;h1&gt;&lt;%= request.attribute.message %&gt;&lt;/h1&gt;<br>
&lt;/body&gt;<br>
<br>
3 Servlet的复习<br>
<br>
对于来自于ASP或CGI背景并转向jsp的人来说,<br>
Servlets代替CGI脚本体现了Java在动态类加载方面的优势。servlet就是一个Java类,<br>
它对Servlet或HttpServlet进行了扩展并放置到适当的路径中。Resin将自动加载servlet并执行它。 <br>
<br>
url /servlet/classname将request提交给Servlet请求器。请求器会从doc/WEB-INF/classes自动加载Java类的类名<br>
并试图执行Servlet的service方法。 <br>
<br>
Resin将定期检查类文件以判断是否被修改过。如果被修改过,则将用新的servlet取代旧的。 <br>
<br>
4 显示留言本 <br>
<br>
在基本框架已经运行后, 下一步是创建model。 <br>
<br>
5 留言本模型<br>
<br>
留言本是很直接的,这里知识包含了一下API。它遵从Bean模型以简化JavaScript。<br>
同样的API可以工作于HashMap, 基于文件,以及数据库应用。 <br>
<br>
JSP文件只能存取public方法。所以JSP文件无法创建一个新的留言本或者增加一个新用户。<br>
这是GuestJsp servlet的责任。 <br>
<br>
jsp.Guest.java API package jsp;<br>
<br>
public class Guest {<br>
Guest();<br>
public String getName();<br>
public String getComment();<br>
}<br>
<br>
<br>
Resin的JavaScript能读取Bean模型。所以使用JavaScript的JSP页面可以存取getName()和getComment()<br>
作为属性。例如,你可以简化使用guest.name和guest.comment。 <br>
<br>
jsp.GuestBook.java API package jsp;<br>
<br>
public class GuestBook {<br>
GuestBook();<br>
void addGuest(String name, String comment);<br>
public Iterator iterator();<br>
}<br>
<br>
<br>
Resin的JavaScript同样可以读取iterator()调用,所以你可以使用JavaScript用于 ... 任何一个来取得用户: <br>
<br>
for (var guest in guestBook) {<br>
...<br>
}<br>
<br>
<br>
<br>
GuestBook作为application属性<br>
为了使得例子保持简单,GuestJsp在application (ServletContext)中存取GuestBook。作为例子,<br>
在application中保存数据是可以接受的,但对于完全成熟的应用,最好仅使用application将数据放到其它地方。<br>
<br>
jsp.GuestJsp.java // get the application object<br>
ServletContext app = getServletContext();<br>
<br>
GuestBook guestBook;<br>
<br>
// The guestBook is stored in the application<br>
synchronized (app) {<br>
guestBook = (GuestBook) app.getAttribute(&quot;guest_book&quot;);<br>
<br>
// If it doesn't exist, create it.<br>
if (guestBook == null) {<br>
guestBook = new GuestBook();<br>
guestBook.addGuest(&quot;Harry Potter&quot;, &quot;Griffindor rules&quot;);<br>
guestBook.addGuest(&quot;Draco Malfoy&quot;, &quot;Slytherin rules&quot;);<br>
app.setAttribute(&quot;guest_book&quot;, guestBook);<br>
}<br>
}<br>
<br>
RequestDispatcher disp;<br>
disp = app.getRequestDispatcher(&quot;login.jsp&quot;);<br>
<br>
// synchronize the Application so the JSP file <br>
// doesn't need to worry about threading<br>
synchronized (app) {<br>
disp.forward(req, res);<br>
}<br>
<br>
<br>
JSP文件本身是简单的。它从application获取留言本并在表中显示内容。通常,<br>
application对象需要同步,因为一些客户端可能同时浏同一页面。<br>
GuestJsp在jsp文件被调用之前小心处理了同步情况。 <br>
<br>
login.jsp: Display Guest Book &lt;%@ page language=javascript %&gt;<br>
<br>
&lt;head&gt;<br>
&lt;title&gt;Hogwarts Guest Book&lt;/title&gt;<br>
&lt;/head&gt;<br>
<br>
&lt;body bgcolor='white'&gt;<br>
<br>
&lt;h1&gt;Hogwarts Guest Book&lt;/h1&gt;<br>
&lt;table&gt;<br>
&lt;tr&gt;&lt;td width='25%'&gt;&lt;em&gt;Name&lt;/em&gt;&lt;td&gt;&lt;em&gt;Comment&lt;/em&gt;<br>
&lt;%<br>
var guestBook = application.attribute.guest_book<br>
<br>
for (var guest in guestBook) {<br>
out.writeln(&quot;&lt;tr&gt;&lt;td&gt;&quot; + guest.name + &quot;&lt;td&gt;&quot; + guest.comment);<br>
}<br>
%&gt;<br>
&lt;/table&gt;<br>
<br>
&lt;/body&gt;<br>
<br>
<br>
Hogwarts Guest Book<br>
Name Comment <br>
Harry Potter Griffindor Rules <br>
Draco Malfoy Slytherin Rules <br>
<br>
<br>
6 留言本的规则(logic)--作为应用属性的留言本 <br>
<br>
留言本的规则是很简单的。如果用户没有登录,他会看到一个提示和登录表。<br>
登录后他会看到提示并在一个表中加入留言。 login.jsp给出了登录的页面,add.jsp给出了<br>
增加流言的页面。 <br>
<br>
GuestJsp在session变量中保存了规则信息。 <br>
<br>
执行'login'来登录或 'add'来增加留言。 其中<br>
name: 用户名 <br>
password: 口令 <br>
comment:留言<br>
<br>
7 留言本规则 ...<br>
<br>
// name from the session<br>
String sessionName = session.getValue(&quot;name&quot;);<br>
<br>
// action from the forms<br>
String action = request.getParameter(&quot;action&quot;);<br>
<br>
// name from the login.jsp form<br>
String userName = request.getParameter(&quot;name&quot;);<br>
<br>
// password from the login.jsp form<br>
String password = request.getParameter(&quot;password&quot;);<br>
<br>
// comment from the add.jsp form<br>
String comment = request.getParameter(&quot;comment&quot;);<br>
<br>
// login stores the user in the session<br>
if (action != null &amp;&amp; action.equals(&quot;login&quot;) &amp;&amp;<br>
userName != null &amp;&amp;<br>
password != null &amp;&amp; password.equals(&quot;quidditch&quot;)) {<br>
session.putValue(&quot;name&quot;, userName);<br>
}<br>
<br>
// adds a new guest<br>
if (action != null &amp;&amp; action.equals(&quot;add&quot;) &amp;&amp;<br>
sessionName != null &amp;&amp;<br>
comment != null) {<br>
guestBook.addGuest(sessionName, comment);<br>
}<br>
<br>
String template;<br>
// if not logged in, use login.jsp<br>
if (session.getValue(&quot;name&quot;) == null)<br>
template = &quot;login.jsp&quot;;<br>
// if logged in, use add.jsp<br>
else<br>
template = &quot;add.jsp&quot;;<br>
<br>
RequestDispatcher disp;<br>
disp = app.getRequestDispatcher(template);<br>
<br>
...<br>
<br>
<br>
login.jsp和add.jsp仅加上了不同forms在前一个section中显示代码。 <br>
<br>
login.jsp &lt;%@ page language=javascript %&gt;<br>
&lt;head&gt;<br>
&lt;title&gt;Hogwarts Guest Book: Login&lt;/title&gt;<br>
&lt;/head&gt;<br>
&lt;body bgcolor='white'&gt;<br>
<br>
&lt;h1&gt;Hogwarts Guest Book&lt;/h1&gt;<br>
&lt;table&gt;<br>
&lt;tr&gt;&lt;td width='25%'&gt;&lt;em&gt;Name&lt;/em&gt;&lt;td&gt;&lt;em&gt;Comment&lt;/em&gt;<br>
&lt;%<br>
var guestBook = application.attribute.guest_book<br>
<br>
for (var guest in guestBook) {<br>
out.writeln(&quot;&lt;tr&gt;&lt;td&gt;&quot; + guest.name + &quot;&lt;td&gt;&quot; + guest.comment);<br>
}<br>
%&gt;<br>
&lt;/table&gt;<br>
&lt;hr&gt;<br>
<br>
&lt;form action='GuestJsp' method='post'&gt;<br>
&lt;input type=hidden name='action' value='login'&gt;<br>
&lt;table&gt;<br>
&lt;tr&gt;&lt;td&gt;Name:&lt;td&gt;&lt;input name='Name'&gt;<br>
&lt;tr&gt;&lt;td&gt;Password:&lt;td&gt;&lt;input name='Password' type='password'&gt;<br>
&lt;tr&gt;&lt;td&gt;&lt;input type=submit value='Login'&gt;<br>
&lt;/table&gt;<br>
&lt;/form&gt;<br>
&lt;/body&gt;<br>
<br>
<br>
8 结论 <br>
<br>
Resin示例演示了扩充留言本的一些方法,包括加入一些智能的东西用于form处理。然而,由于forms取得更多的只能,即使是JSP模板也变得复杂化了。<br>
有一个结论:XTP模板。 <br>
<br>

  </table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -