在上一篇文章中介绍校验时提到客户边的校验用到了JavaScript,实际上用Struts配合JavaScript还可以实现许多有用的功能,比如,级联下拉菜单的实现就是一个典型的例子:
本例假设要实现的是一个文章发布系统,我们要发布的文章分为新闻类和技术类,其中新闻类又分为时事新闻和行业动态;技术类又分为操作系统、数据库、和编程语言等,为了便于添加新的条目,所有这些都保存在数据库表中。
为此,我们建立一个名为articleClass的表和一个名为articleSubClass的表。
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>articleClass表的结构如下: |
表建好后,在articleClass表中录入如下数据:如,01、新闻类;02、技术类
在articleSubClass表中录入:01、01、时事新闻;01、02、行业动态;02、01、操作系统等记录。到这里,数据库方面的准备工作就已做好。
有了前面做登录例子的基础,理解下面要进行的工作就没有什么难点了,我们现在的工作也在原来mystruts项目中进行。首先,建立需要用到的formbean即ArticleClassForm,其代码如下:
- package entity;
- import org.apache.struts.action.*;
- import javax.servlet.http.*;
- import java.util.Collection;
- public class ArticleClassForm extends ActionForm {
- //为select的option做准备
- private Collection beanCollection;
- private String singleSelect = "";
- private String[] beanCollectionSelect = { "" };
- private String articleClassID;
- private String articleClassName;
- private String subI;//子类所在行数
- private String subJ;//子类所在列数
- private String articleSubClassID;
- private String articleSubClassName;
- public Collection getBeanCollection(){
- return beanCollection;
- }
- public void setBeanCollection(Collection beanCollection){
- this.beanCollection=beanCollection;
- }
- public String getSingleSelect() {
- return (this.singleSelect);
- }
- public void setSingleSelect(String singleSelect) {
- this.singleSelect = singleSelect;
- }
- public String[] getBeanCollectionSelect() {
- return (this.beanCollectionSelect);
- }
- public void setBeanCollectionSelect(String beanCollectionSelect[]) {
- this.beanCollectionSelect = beanCollectionSelect;
- }
- public String getArticleClassID() {
- return articleClassID;
- }
- public void setArticleClassID(String articleClassID) {
- this.articleClassID = articleClassID;
- }
- public String getArticleClassName() {
- return articleClassName;
- }
- public void setArticleClassName(String articleClassName) {
- this.articleClassName = articleClassName;
- }
- public String getSubI() {
- return subI;
- }
- public void setSubI(String subI) {
- this.subI = subI;
- }
- public String getSubJ() {
- return subJ;
- }
- public void setSubJ(String subJ) {
- this.subJ = subJ;
- }
- public String getArticleSubClassID() {
- return articleSubClassID;
- }
- public void setArticleSubClassID(String articleSubClassID) {
- this.articleSubClassID = articleSubClassID;
- }
- public String getArticleSubClassName() {
- return articleSubClassName;
- }
- public void setArticleSubClassName(String articleSubClassName) {
- this.articleSubClassName = articleSubClassName;
- }
- }
将它放在包entity中。其次,我们的系统要访问数据库,因此也要建立相应的数据库访问对象ArticleClassDao,其代码如下:
- package db;
- import entity.ArticleClassForm;
- import db.*;
- import java.sql.*;
- import java.util.Collection;
- import java.util.ArrayList;
- import org.apache.struts.util.LabelValueBean;
- public class ArticleClassDao {
- private Connection con;
- public ArticleClassDao(Connection con) {
- this.con=con;
- }
- public Collection findInUseForSelect(){
- PreparedStatement ps=null;
- ResultSet rs=null;
- ArrayList list=new ArrayList();
- String sql="select * from articleClass order by articleClassID";
- try{
- if(con.isClosed()){
- throw new IllegalStateException("error.unexpected");
- }
- ps=con.prepareStatement(sql);
- rs=ps.executeQuery();
- while(rs.next()){
- String value=rs.getString("articleClassID");
- String label=rs.getString("articleClassName");
- list.add(new LabelValueBean(label,value));
- }
- return list;
- }
- catch(SQLException e){
- e.printStackTrace();
- throw new RuntimeException("error.unexpected");
- }
- finally{
- try{
- if(ps!=null)
- ps.close();
- if(rs!=null)
- rs.close();
- }
- catch(SQLException e){
- e.printStackTrace();
- throw new RuntimeException("error.unexpected");
- }
- }
- }
- public Collection findInUseForSubSelect(){
- PreparedStatement ps=null;
- ResultSet rs=null;
- PreparedStatement psSub=null;
- ResultSet rsSub=null;
- int i=0;//大类记数器
- int j=0;//小类记数器
- String classID="";
- String subClassID="";
- String subClassName="";
- ArrayList list=new ArrayList();
- ArticleClassForm articleClassForm;
- String sql="select * from articleClass order by articleClassID";
- try{
- if(con.isClosed()){
- throw new IllegalStateException("error.unexpected");
- }
- ps=con.prepareStatement(sql);
- rs=ps.executeQuery();
- while(rs.next()){
- i++;
- classID=rs.getString("articleClassID");
- String sqlSub="select * from articleSubClass where articleClassID=?
- order by articleSubClassID";
- psSub=con.prepareStatement(sqlSub);
- psSub.setString(1,classID);
- rsSub=psSub.executeQuery();
- articleClassForm=new ArticleClassForm();
- articleClassForm.setSubI(""+i);
- articleClassForm.setSubJ(""+j);
- articleClassForm.setArticleSubClassID("请输入一个小类");
- articleClassForm.setArticleSubClassName("请输入一个小类");
- list.add(articleClassForm);
- while(rsSub.next()){
- subClassID=rsSub.getString("articleSubClassID");
- subClassName=rsSub.getString("articleSubClassName");
- j++;
- //optionStr="articleSubClassGroup[" + i + "][" + j + "]=
- new Option('"+ subClassName +"','"+ subClassID+ "')";
- articleClassForm=new ArticleClassForm();
- articleClassForm.setSubI(""+i);
- articleClassForm.setSubJ(""+j);
- articleClassForm.setArticleSubClassID(subClassID);
- articleClassForm.setArticleSubClassName(subClassName);
- list.add(articleClassForm);
- }
- j=0;
- }
- return list;
- }
- catch(SQLException e){
- e.printStackTrace();
- throw new RuntimeException("error.unexpected");
- }
- finally{
- try{
- if(ps!=null)
- ps.close();
- if(rs!=null)
- rs.close();
- }
- catch(SQLException e){
- e.printStackTrace();
- throw new RuntimeException("error.unexpected");
- }
- }
- }
- }
将它保存在db目录中。它们的目的是将文章的类和子类信息从数据库表中读出,以一定的格式保存在集合对象中以供页面显示。
再次,我们要建立相应的jsp文件,文件名为selectArticleClass.jsp,代码如下:
- <%@ page contentType="text/html; charset=UTF-8" %>
- <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
- <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
- <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
- <html>
- <head>
- <title>选择文件类别</title>
- >
- <body bgcolor="#ffffff">
- <h3>
- 选择文件所属类型
- >
- <html:errors/>
- <table width="500" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td><html:form name="articleClassForm" type="entity.ArticleClassForm"
- action="selectArticleClassAction.do">
- <table width="500" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <td align="right">文章大类*td>
- <td>
- <html:select property="articleClassID" styleClass="word"
- onchange="articleClassFormredirect(this.options.selectedIndex)">
- <html:option value="">请选择一个大类html:option>
- <html:optionsCollection name="articleClassForm"
- property="beanCollection" styleClass="word"/>
- html:select>
- td>
- tr>
- <tr>
- <td align="right">文章小类*td>
- <td>
- <select name="articleSubClassID" Class="word" >
- <option value="">请选择一个小类option>
- select>
- <SCRIPT language=JavaScript>
- <!-- </sp-->
- var articleSubClassGroups=document.articleClassForm.articleClassID.
- options.length
- var articleSubClassGroup=new Array(articleSubClassGroups)
- for (i=0; i<articleSubClassGroups; i++)
- articleSubClassGroup[i]=new Array()
- <logic:iterate name="articleSubClassList" id="articleClassForm"
- scope="request" type="entity.ArticleClassForm">
- articleSubClassGroup[<bean:write name="articleClassForm"
- property="subI"/>][<bean:write name="articleClassForm"
- property="subJ"/>]=new Option("<bean:write name="articleClassForm"
- property="articleSubClassName"/>","<bean:write name="articleClassForm"
- property="articleSubClassID"/>")
- logic:iterate>
- var articleSubClassTemp=document.articleClassForm.articleSubClassID
- function articleClassFormredirect(x){
- for (m=articleSubClassTemp.options.length-1;m>0;m--)
- articleSubClassTemp.options[m]=null
- for (i=0;i<articleSubClassGroup[x].length;i++){
- articleSubClassTemp.options[i]=new
- Option(articleSubClassGroup[x][i].text,
- articleSubClassGroup[x][i].value)
- }
- articleSubClassTemp.options[0].selected=true
- }
- //-->
- SCRIPT>
- td>
- tr>
- table>
- html:form>
- td>
- tr>
- table>
- body>
- html>
这里值得重点关注的是其中的JavaScript代码,有兴趣的可以仔细分析一下它们是怎样配合集合中的元素来实现级联选择的。
最后,为了例子的完整。我们将涉及到action代码和必要的配置代码在下面列出:其中,action的文件名为SelectArticleClassAction.java,代码如下:
- package action;
- import entity.*;
- import org.apache.struts.action.*;
- import javax.servlet.http.*;
- import javax.sql.DataSource;
- import java.sql.Connection;
- import db.ArticleClassDao;
- import java.util.Collection;
- import java.sql.SQLException;
- public class SelectArticleClassAction extends Action {
- public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,
- HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
- /**@todo: complete the business logic here, this is just a skeleton.*/
- ArticleClassForm articleClassForm = (ArticleClassForm) actionForm;
- DataSource dataSource;
- Connection cnn=null;
- ActionErrors errors=new ActionErrors();
- try{
- dataSource = getDataSource(httpServletRequest,"A");
- cnn = dataSource.getConnection();
- ArticleClassDao articleClassDao=new ArticleClassDao(cnn);
- Collection col=articleClassDao.findInUseForSelect();
- articleClassForm.setBeanCollection(col);
- httpServletRequest.setAttribute("articleClassList",col);
- //处理子类选项
- Collection subCol=articleClassDao.findInUseForSubSelect();
- httpServletRequest.setAttribute("articleSubClassList",subCol);
- return actionMapping.findForward("success");
- }
- catch(Throwable e){
- e.printStackTrace();
- //throw new RuntimeException("未能与数据库连接");
- ActionError error=new ActionError(e.getMessage());
- errors.add(ActionErrors.GLOBAL_ERROR,error);
- }
- finally{
- try{
- if(cnn!=null)
- cnn.close();
- }
- catch(SQLException e){
- throw new RuntimeException(e.getMessage());
- }
- }
- saveErrors(httpServletRequest,errors);
- return actionMapping.findForward("fail");
- }
- }
将其保存在action目录中。
在struts-config.xml文件中做如下配置:
在<ccid_nobr></ccid_nobr>
- <form-beans>
中加入<ccid_nobr></ccid_nobr>
- <form-bean name="articleClassForm" type="entity.ArticleClassForm" />
在<ccid_nobr></ccid_nobr>
- <action-mappings>
中加入:
- <action name="articleClassForm" path="/selectArticleClassAction" scope="session"
- type="action.SelectArticleClassAction" validate="false">
- <forward name="success" path="/selectArticleClass.jsp" />
- <forward name="fail" path="/genericError.jsp" />
为了对应配置中的<ccid_nobr></ccid_nobr>
- <forward name="fail" path="/genericError.jsp" />
,我们还要提供一个显示错误信息的jsp页面,代码加入:
- <html:errors />
现在一切就绪,可以编译执行了。在浏览器中输入:http://127.0.0.1:8080/mystruts/selectArticleClassAction.do就可以看到该例子的运行结果了。(T111)
发表评论
-
获取XML数据,页面显示,实现详细信息与列表的联动效果
2007-03-22 15:04 1682页面显示: 代码 //加载数据岛 ... -
在Struts中如何编写错误处理页面(errorpage.jsp)
2007-03-22 15:00 4260在Struts中对于exception出现的情况下,可以使用 ... -
Struts原理与实践(6)
2007-03-22 14:54 1272本文我们来讨论一下Struts中的输入校验问题。我们知道,信息 ... -
Struts原理与实践(5)
2007-03-22 14:52 1112一个支持i18n的应用程序应该有如下一些特征: 1增加支持的语 ...
相关推荐
Struts原理与实践(1) - Java - New - JavaEye论坛.mht
### Struts原理与实践 #### 一、Struts框架概览 **Struts**框架,作为Java Web开发领域内的一款成熟且广泛应用的框架,自问世以来便受到开发者们的青睐。Struts框架的核心设计理念在于实现MVC(Model-View-...
罗会波的《Struts原理与实践》这本书深入浅出地解析了Struts的核心概念和技术,帮助开发者全面理解和掌握这一框架。 1. **MVC设计模式**:Struts将Web应用的业务逻辑、数据模型和用户界面分离,使得开发者可以独立...
在本资料"Struts原理与实践(五)"中,我们将深入探讨Struts的核心概念、工作流程以及实际应用中的关键点。 首先,Struts框架的基础是MVC模式。Model代表业务逻辑,View负责显示,Controller则协调这两者。在Struts...
Struts是Java Web开发中的一个开源框架,由Apache软件基金会维护。它主要基于Model-View-Controller(MVC)设计模式,旨在简化企业...通过阅读《Struts原理与实践(一)》PDF文档,可以更深入地了解和掌握Struts框架。
提供的文档可能涵盖了这些主题,从"struts原理与实践(1).doc"到"struts原理与实践(7).doc"逐步深入,"Java学习阶段需研究的开源项目.doc"则可能介绍了一些相关的Java学习资源。阅读这些文档将有助于全面理解和掌握...
本文主要讨论Struts中JDBC的工作原理以及在实践中的基本配置。 一、JDBC工作原理 JDBC是Java平台提供的一个标准API,它允许Java应用程序与各种类型的数据库进行通信。JDBC的核心包括两个包:java.sql和javax.sql。...
6. ActionServlet与RequestDispatcher:Struts的ActionServlet接收请求后,通过RequestDispatcher将请求转发给相应的Action,Action执行完毕后,再通过Dispatcher返回响应到合适的视图。 通过Struts,开发者可以...
在"Struts原理与实践(二)"这个主题中,我们将深入探讨Struts框架的核心概念、工作原理以及实际应用。 **1. Struts框架的核心组件** - **ActionServlet**: Struts框架的核心控制器,负责接收HTTP请求,解析请求...
在本文中,我们将深入理解Struts的基本原理,并通过一个简单的登录示例来演示其工作流程。 首先,我们需要了解MVC模式。在MVC架构中,Model负责处理数据和业务逻辑,View负责展示用户界面,而Controller则作为两者...
Struts 是一个开源的Java Web应用程序框架,专为构建企业级Web应用而设计。它遵循Model-View-Controller (MVC)设计模式,旨在...通过学习和实践Struts,开发者可以更好地理解和掌握Web应用的架构设计,提升自身技能。
Struts 是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它主要负责处理用户请求,管理业务逻辑,以及与视图层的交互。在本篇文章中,我们将深入探讨如何利用Struts 实现一个文章发布系统,...
7. **Struts 1与Struts 2的区别** - Struts 2比Struts 1更灵活,支持更多类型的拦截器和结果类型。 - Struts 2的配置更简洁,使用注解替代部分XML配置。 - Struts 2引入了OGNL(Object-Graph Navigation Language...
此外,由于校验规则与具体应用分离,它们可以被多个不同的表单重用,降低了代码重复。客户端的JavaScript验证还可以提供即时反馈,提高用户体验。总的来说,Struts的Validator框架是处理Web应用输入校验的一种强大而...
Struts 是一个流行的Java Web开发框架,主要用于...在实践中,开发者需要关注字符集的转换,确保在客户端和服务器之间传输数据时不会丢失或混淆信息。同时,合理地组织和管理资源文件,可以使代码更整洁,更容易维护。
Struts 是一个经典的Java Web开发框架,主要用于构建MVC(模型-视图-控制器)架构的应用程序。在国际化(i18n)编程方面,Struts 提供了强大的支持,使得应用能够根据用户所在地区和语言环境显示相应的内容。本文将...
在本文中,我们将深入探讨Struts2的原理和实践,以一个简单的登录示例来阐述其关键组件和工作流程。 首先,我们来看一下开发Struts2应用的基本步骤: 1. **定义视图(Views)**:视图通常由JSP页面组成,负责展示...
下面将详细介绍这三个框架的基本概念、工作原理以及它们如何协同工作。 首先,Struts 是 Apache 软件基金会的一个项目,它的主要目的是提供一种结构化的、可扩展的方式来构建基于 Java 的 Web 应用。Struts 通过 ...