Java Web学习笔记(2)——一个简单的Struts2例子

本文详细介绍了如何利用Struts2框架构建一个简单的图书查询系统,包括创建web.xml配置文件、设计数据处理类BookDAO、编写QueryAction类、配置struts.xml文件、编写表现层JSP代码等步骤。

在简单了解了一下Struts2框架的运行原理之后,我们做了一个简单的例子——图书价格查询系统

在工程的根目录下创建如下web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>	
  
  <filter>
  <!-- 配置Struts2过滤器 -->
    <filter-name>Struts2</filter-name>
    <!-- 在这里我们指定Struts2过滤器的类名,在一些老教材中使用的是dispatcher.FilterDispatcher类,现在已不建议使用 -->
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <!-- 配置Struts2过滤器要过滤的路径 -->
  <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

然后我们创建一个新包com.test.DAO,并在该包下创建数据处理类BookDAO。代码如下:

package com.test.DAO;
import java.util.*;

public class BookDAO {
	//新建一个哈希图链表用于储存书名和价格
	private static Map<String,Integer> books=new LinkedHashMap<String,Integer>();
	//为了方便调试,将数据静态初始化
	static{
		books.put("西游记",39);
		books.put("红楼梦",102);
		books.put("三国演义",53);
	}
	//getBooks方法根据书名进行模糊查询,返回用于保存查询结果的Map对象
	public Map<String,Integer> getBooks(String name){
		Map<String,Integer> books=new LinkedHashMap<String,Integer>();
		//对BookDAO.books进行循环遍历搜索
		for(Map.Entry<String,Integer> entry:BookDAO.books.entrySet()){
			if(entry.getKey().toLowerCase().contains(name.toLowerCase()))
				//如果条目符合,则将其放入保存查询结果的Map对象中返回
				books.put(entry.getKey(),entry.getValue());
		}
		return books;
	}
}

接下来我们创建QueryAction类,托Struts2技术的福,我们可以通过在Action类中加入getter和setter方法来非常方便地读取和操作name(查询关键字)、result(查询返回结果)的值,具体代码如下:

package com.test.action;
import com.test.DAO.*;
import java.util.*;

public class QueryAction {
	private String name;	
	private Map<String,Integer> result;
	public Map<String,Integer> getResult(){
		return result;
	}
	public void setResult(Map<String,Integer> result){
		this.result=result;
	}
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	
	public String execute() throws Exception{
		try{
			BookDAO book=new BookDAO();
			//根据传入的关键字在我们早已定义好的静态数据中搜索并返回结果
			Map<String,Integer> books=book.getBooks(name);			
			//将搜索结果放入result中
			setResult(books);
			//返回SUCCESS用于页面跳转
			return "success";
		}catch (Exception e){
			return "error";
		}
	}
}

然后我们在工程中的src目录下建立一个struts.xml文件,用于配置Action类:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <package name="struts2" extends="struts-default" namespace="/">
    <!-- 将QueryAction的访问路径设为query -->
    <action name="query" class="com.test.action.QueryAction">
      <!-- 如果QueryAction类返回SUCCESS,则跳转到result.jsp -->
      <result name="success">/result.jsp</result>
      <result name="error">/error.jsp</result>
    </action>
  </package>
</struts>

终于可以开始动手写表现层代码了!让我们引入Struts2标签来帮助我们完成用于输入查询关键字的JSP页面querybooks.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 声明使用Struts2标签 -->
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>查询图书信息</title>
  </head>
  
  <body>
    <!-- Struts2的form标签,query为我们事先配置好的QueryAction类的路径 -->
    <s:form action="query">
      <!-- 注意这里name属性值必须为"name" -->
      <s:textfield label="书名" name="name"/>
      <s:submit value="查询"/>
    </s:form>
  </body>
</html>

还有输出查询结果的JSP页面:

<%@ 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>
    <table border="1">
      <tr>
        <td>书名</td>
        <td>价格</td>
      </tr>
      <!-- s:iterator是迭代器标签,用于迭代输出数据 -->
      <s:iterator value="result">
      <tr>
        <td><s:property value="key"/></td>
        <td><s:property value="value"/></td>
      </tr>
      </s:iterator>
    </table>
  </body>
</html>

大功告成,让我们赶紧在浏览器中测试一下代码吧!
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 第 一 章 概述 1-1 简述计算机程序设计语言的发展阶段。 解: 自从计算机诞生以来,程序设计语言经历了从机器语言、汇编语言到高级语言的演变过程,C++语言作为一种面向对象的编程语言,也属于高级语言范畴。 1-2 面向对象的编程语言具备哪些特性? 解: 面向对象的编程语言与传统的编程语言有着本质的区别,其设计初衷是为了更直观地模拟现实世界中存在的事物及其相互关系。这编程语言将客观事物视为具有属性和行为的对象,通过抽象方法提取出同一对象的共同属性(静态特征)和行为(动态特征),从而构建。借助的继承与多态机制,能够便捷地实现代码复用,显著缩短软件开发周期,并确保软件风格的一致性。因此,面向对象的编程语言使得程序能够较为准确地反映问题域的本质,软件开发人员可以运用人惯用的思维模式进行开发工作。C++语言是目前应用最为广泛的面向对象编程语言。 1-3 结构化程序设计方法是什么?这种方法有哪些优势和不足? 解: 结构化程序设计的核心思想是自顶向下、逐步求精;其程序结构按照功能划分为多个基本模块;各模块之间的关联尽可能简化,在功能上保持相对独立性;每个模块内部均由顺序、选择和循环三种基本结构构成;模块化实现的具体途径是利用子程序。结构化程序设计由于采用模块分解与功能抽象,自顶向下、分而治之的策略,从而有效地将一个较为复杂的程序系统设计任务分解成许多易于管理和处理的子任务,便于开发与维护。 尽管结构化程序设计方法具备诸多优点,但它本质上仍是一种面向过程的程序设计方法,将数据与处理数据的操作分离为相互独立的实体。当数据结构发生变化时,所有相关的处理过程都需要进行相应的调整,每一种...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值