下面是《Beginning JSP, JSF and Tomcat》书中的代码例子,学习一下如何用servlet和jsp开发网页
jsp开发网站有两类结构(1,纯jsp;2,servlet负责接入请求处理逻辑,jsp负责渲染,示例图分别如下)
代码采用第二种结构,目录结构如下图
JSP代码如下:
(index.jsp)
<%@page language="java" contentType="text/html"%>
<%@page trimDirectiveWhitespaces="true"%>
<%@page session="true" import="java.util.Vector, ebookshop.Book"%>
<html>
<head>
<title>E-bookshop</title>
<style type="text/css">
body {background-color:gray; font-size=10pt;}
H1 {font-size:20pt;}
table {background-color:white;}
</style>
</head>
<body>
<H1>Your online Bookshop</H1>
<hr/><p/>
<% // 1: 用户直接访问http://127.0.0.1:8080/index.jsp,没有数据,302跳转到/eshop
Vector<ebookshop.Book> booklist =
(Vector<ebookshop.Book>)session.getValue("ebookshop.list");
if (booklist == null) {
response.sendRedirect("/eshop");
}
else {
%>
<form name="addForm" action="eshop" method="POST">
<input type="hidden" name="do_this" value="add">
Book:
<select name=book>
<% // 2: 从session中获取booklist,添加在选择表单内
for (int i = 0; i < booklist.size(); i++) {
out.println("<option>" + booklist.elementAt(i) + "</option>");
}
%>
</select>
Quantity: <input type="text" name="qty" size="3" value="1">
<input type="submit" value="Add to Cart">
</form>
<p/>
<% // 3: 从session中获取已购书单,显示在table中
Vector shoplist =
(Vector<ebookshop.Book>)session.getAttribute("ebookshop.cart");
if (shoplist != null && shoplist.size() > 0) {
%>
<table border="1" cellpadding="2">
<tr>
<td>TITLE</td>
<td>PRICE</td>
<td>QUANTITY</td>
<td></td>
</tr>
<% // 4: 显示书单
for (int i = 0; i < shoplist.size(); i++) {
Book aBook = (Book)shoplist.elementAt(i);
%>
<tr>
<form name="removeForm" action="eshop" method="POST">
<input type="hidden" name="position" value="<%=i%>">
<input type="hidden" name="do_this" value="remove">
<td><%=aBook.getTitle()%></td>
<td align="right">$<%=aBook.getPrice()%></td>
<td align="right"><%=aBook.getQuantity()%></td>
<td><input type="submit" value="Remove from Cart"></td>
</form>
</tr>
<%
} // for (int i..
%>
</table>
<p/>
<form name="checkoutForm" action="eshop" method="POST">
<input type="hidden" name="do_this" value="checkout">
<input type="submit" value="Checkout">
</form>
<%
} // if (shoplist..
} // if (booklist..else..
%>
</body>
</html>
(Checkout.jsp)
<%@page language="java" contentType="text/html"%>
<%@page session="true" import="java.util.Vector, ebookshop.Book" %>
<html>
<head>
<title>E-Bookshop Checkout</title>
<style type="text/css">
body {background-color:gray; font-size=10pt;}
H1 {font-size:20pt;}
table {background-color:white;}
</style>
</head>
<body>
<H1>Your online Bookshop - Checkout</H1>
<hr/><p/>
<table border="1" cellpadding="2">
<tr>
<td>TITLE</td>
<td align="right">PRICE</td>
<td align="right">QUANTITY</td>
</tr>
<%
Vector<Book> shoplist =
(Vector<Book>)session.getAttribute("ebookshop.cart");
for (Book anOrder : shoplist) {
%>
<tr>
<td><%=anOrder.getTitle()%></td>
<td align="right">$<%=anOrder.getPrice()%></td>
<td align="right"><%=anOrder.getQuantity()%></td>
</tr>
<%
}
session.invalidate();
%>
<tr>
<td>TOTALS</td>
<td align="right">$<%=(String)request.getAttribute("dollars")%></td>
<td align="right"><%=(String)request.getAttribute("books")%></td>
</tr>
</table>
<p/>
<a href="/ebookshop/eshop">Buy more!</a>
</body>
</html>
Servlet逻辑代码
(ShoppingServlet.java)
package ebookshop;
import java.util.Vector;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import ebookshop.Book;
public class ShoppingServlet extends HttpServlet {
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doPost(req, res);
}
public void doPost (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
HttpSession session = req.getSession(true);
@SuppressWarnings("unchecked")
Vector<Book> shoplist = (Vector<Book>)session.getAttribute("ebookshop.cart");
String do_this = req.getParameter("do_this");
// If it is the first time, initialize the list of books, which in
// real life would be stored in a database on disk
// 不是从form表单发起的post请求,初始化数据dispatch到index.jsp
if (do_this == null) {
Vector<String> blist = new Vector<String>();
blist.addElement("Learn HTML5 and JavaScript for iOS. Scott Preston $39.99");
blist.addElement("Java 7 for Absolute Beginners. Jay Bryant $39.99");
blist.addElement("Beginning Android 4. Livingston $39.99");
blist.addElement("Pro Spatial with SQL Server 2012. Alastair Aitchison $59.99");
blist.addElement("Beginning Database Design. Clare Churcher $34.99");
session.setAttribute("ebookshop.list", blist);
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/");
rd.forward(req, res);
}
else {
// If it is not the first request, it can only be a checkout request
// or a request to manipulate the list of books being ordered
// checkout请求,从session中获取booklist然后计算价格输出到Checkout.jsp
if (do_this.equals("checkout")) {
float dollars = 0;
int books = 0;
for (Book aBook : shoplist) {
float price = aBook.getPrice();
int qty = aBook.getQuantity();
dollars += price * qty;
books += qty;
}
req.setAttribute("dollars", new Float(dollars).toString());
req.setAttribute("books", new Integer(books).toString());
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/Checkout.jsp");
rd.forward(req, res);
} // if (..checkout..
// Not a checkout request - Manipulate the list of books
else {
//删除一本书
if (do_this.equals("remove")) {
String pos = req.getParameter("position");
shoplist.removeElementAt((new Integer(pos)).intValue());
}
else if (do_this.equals("add")) {//添加一本书
boolean found = false;
Book aBook = getBook(req);
if (shoplist == null) { // the shopping cart is empty
shoplist = new Vector<Book>();
shoplist.addElement(aBook);
}
else { // update the #copies if the book is already there
for (int i = 0; i < shoplist.size() && !found; i++) {
Book b = (Book)shoplist.elementAt(i);
if (b.getTitle().equals(aBook.getTitle())) {
b.setQuantity(b.getQuantity() + aBook.getQuantity());
shoplist.setElementAt(b, i);
found = true;
}
} // for (i..
if (!found) { // if it is a new book => Add it to the shoplist
shoplist.addElement(aBook);
}
} // if (shoplist == null) .. else ..
} // if (..add..
// 更新图书列表,返回index.jsp
session.setAttribute("ebookshop.cart", shoplist);
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/");
rd.forward(req, res);
} // if (..checkout..else
} // if (do_this..
} // doPost
private Book getBook(HttpServletRequest req) {
String myBook = req.getParameter("book");
int n = myBook.indexOf('$');
String title = myBook.substring(0, n);
String price = myBook.substring(n+1);
String qty = req.getParameter("qty");
return new Book(title, Float.parseFloat(price), Integer.parseInt(qty));
} // getBook
}
(Book.java)
package ebookshop;
public class Book {
String title;
float price;
int quantity;
public Book(String t, float p, int q) {
title = t;
price = p;
quantity = q;
}
public String getTitle() { return title; }
public void setTitle(String t) { title = t; }
public float getPrice() { return price; }
public void setPrice(float p) { price = p; }
public int getQuantity() { return quantity; }
public void setQuantity(int q) { quantity = q; }
}
Servlet编译为class文件,移动到classes下面的ebookshop目录下
javac -classpath .:/root/apache/apache-tomcat-6.0.37/lib/servlet-api.jar:/usr/share/java/servlet.jar *.java
最后配置/usr/share/tomcat6/conf/web.xml文件,添加servlet路由
<servlet> <servlet-name>EBookshopServlet</servlet-name> <servlet-class>ebookshop.ShoppingServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>EBookshopServlet</servlet-name> <url-pattern>/eshop</url-pattern> </servlet-mapping>
访问http://127.0.0.1:8080/index.jsp或者http://127.0.0.1:8080/eshop即可