在MyEcplise开发第一个Struts程序相当简单,它已经集成了Struts了,所以不需要自己手动加载Struts的库,只需要给创建的Web Project执行【MyEclipse】-【Project capabilities】-【add Struts capabilities】就自动会在src目录下添加Struts.xml,并且web.xml也会自动做出相应的修改改。
今天的实例是一个图书查询系统实例,查询界面是querybooks.jsp,结果显示页面是result.jsp,错误页面时error.jsp。action是QueryAction.java
只要是action类就必定有execute() 方法,在execute() 方法中我们设定了action的跳转页面,比如在下面的代码中我们知道如果根据传进来的参数能够找到匹配的图书的话,就会从action跳转到return "result";界面,而如果没有图书与查询条件相匹配,就会跳转到return "error"; 这里的result和error并不是真正的界面,只是一个字段而已,不过我们将在后面的Struts.xml中配置这些字段所对应的跳转界面。
package chapter7.action; import java.util.Map; import chapter7.dao.BookDAO; public class QueryAction { private String name; private Map<String,Integer> result; public String getName() { return name; } public void setName(String name) { this.name = name; } public Map<String, Integer> getResult() { return result; } public void setResult(Map<String, Integer> result) { this.result = result; } //action类必定有一个execute()方法。 public String execute() throws Exception { try { BookDAO book=new BookDAO(); Map<String, Integer> books=book.getBooks(name); setResult(books); return "result"; } catch(Exception e) { return "error"; } } }
这里类是用于查询图书的。首先有一个静态方法给Map<String,Integer> books 赋了初值,然后通过getBooks(String name)方法在books 对象中查找是否有与name匹配的图书,如果有则将其存放都专门的查询结果对象中,最后返回这个对象,如果没有返回空。
package chapter7.dao; import java.util.LinkedHashMap; import java.util.Map; public class BookDAO { //定义一个保存图书信息的静态Map对象。 private static Map<String,Integer> books=new LinkedHashMap<String,Integer>(); static { books.put("J2EE整合详解与典型案例",79); books.put("数据库系统概念",69); books.put("C++程序设计",59); books.put("ASP.NET开发",49); } public static Map<String, Integer> getBooks(String name) { //定义一个保存查询结果的books对象 Map<String,Integer> books=new LinkedHashMap<String,Integer>(); //对BookDAO.books的对象进行逐个扫描,如果对象中有匹配查询条件的,则保存到books对象中。 for(Map.Entry<String, Integer>entry:BookDAO.books.entrySet()) { if(entry.getKey().toLowerCase().contains(name.toLowerCase())) books.put(entry.getKey(), entry.getValue()); } return books; } }
这个配置未见定义了result和error所对应的跳转页面分别是webroot根目录下的result.jsp和error.jsp这两个页面。namespace="/" 这个很重要,如果没有配置正确会出现错误,具体错误与解决方法参考另外一票博客:http://blog.csdn.net/xw13106209/archive/2010/09/14/5884278.aspx .
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="Struts2" namespace="/" extends="struts-default"> <action name="query" class="chapter7.action.QueryAction"> <result name="result">/result.jsp</result> <result name="error">/error.jsp</result> </action></package> </struts>
简单的jsp页面。用于显示查询结果。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>查询结果界面</title> </head> <body> <table border="1"> <tr> <td>书名</td> <td>价格</td> </tr> <% Map<String,Integer> result=(Map<String,Integer>)request.getAttribute("result"); for(Map.Entry<String,Integer>entry: result.entrySet()) { %> <tr> <td><%=entry.getKey() %></td> <td><%=entry.getValue() %></td> </tr> <%} %> </table> </body> </html>
在result.jsp中我们可以发现使用request.getAttrbute()方法可以获得在QueryAction中setResult(books)方法中所保存的books对象的内容。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>查询图书信息</title> </head> <body> <s:form action="query"> <s:textfield label="书名" name="name"/> <s:submit value="查询"/> </s:form> </body> </html>
从上面<s:form action="query">可以看出querybook.jsp界面的下一个跳转action是query。而在Struts.xml中也正好定义了名为query的action,如Struts.xml设置所示,其中不仅定义了一个名为query的action,并且指出该action所对应的类是QueryAction,在result标签中定义了“result”和“error”两种情况所需要跳转的页面。
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'error.jsp' starting page</title> </head> <body> ERROR page. <br> </body> </html>