struts1开发学习笔记

使用一个简单的例子记录struts1开发过程。

0、 描述

主要功能描述:

index界面上只有两个超链接,分别可以打开录入产品界面和显示产品列表界面。

newProduct.jsp是录入的界面,searchProduct.jsp是查询列表的界面。

ProductAction.java是处理逻辑的action

简单描述流程图:

简单描述流程图







1、 构建环境

在Myeclipse中,新建一个工程StrutsTest,选择该工程,右键Myeclipse->add sruts capapibality,弹出界面,选择struts1.2支持。如下图所示:

添加struts1支持

添加完struts支持后,lib目录下会增添struts的jar包、增添struts的配置文件:/WEB-INF/struts-config.xml、同时在web.xml中增添了struts的配置。

3、 代码编写

1)          创建表结构,只有三个字段

create table t_product
(
  product_id varchar2(4) primary key,
  product_name  varchar2(50) not null,
  price float
);

2)          创建工具类Util.java,从数据库连接池中获得连接。需要两个步骤

第一步:在WebRoot/META-INF/下新建一个context文件,通过jndi方式配置数据源,context.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
 <Resource
      auth="Container"
      name="jdbc/StrutsTestPool"
      type="javax.sql.DataSource"      
      driverClassName="oracle.jdbc.driver.OracleDriver"
	  url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
      username="apps"
      password="apps"      
      maxActive="20"/>
</Context>

第二步:在util类中读取配置获得连接,util.java如下:

package com.company.struts.util;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class Util {
	/**
	 * 通过连接池得到连接
	 * @return
	 * @throws Exception
	 */
	public static Connection getPoolConnection() throws Exception{
		Context ctx = new InitialContext();
		DataSource ds = (DataSource)ctx.lookup("java:/comp/env/jdbc/StrutsTestPool");
		Connection conn = ds.getConnection();
		return conn;
	}
}

3)        创建工具类EncodingFilter.java,自定义过滤器,并在web.xml中配置,参考web.xml配置中内容。EncodingFilter.java的内容如下:

package com.company.struts.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);

	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}

4)          修改web.xml,指定首页为index.jsp。文件内容如下:最后定义了一个fileld的过滤器,是用来过滤字符编码的,后面会提到。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 自定义的fileld 用来过滤字符编码 -->
  <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>com.company.struts.util.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

5)          在WebRoot下打开index.jsp,去掉无用信息,写代码如下:

<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
  <head> 
    <title></title>
  </head>
  
  <body>
  <br>
  <br>
  <br>
  	<table width = "500px" align = "center" height = "200px">
  		<tr><td>
  		<a href = "productAction.action?method=viewAddForm" target="black">input</a> <br /><br />
  		<a href = "productAction.action?method=query" target="black">search</a>
  		</td></tr>
	</table>  	
  </body>
</html>

6)          index.jsp中提到productAction.action?method=viewAddForm,需要在struts的配置文件struts-config.xml中配置实现的action,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans>
  	<form-bean name="productForm" type="com.company.struts.vo.ProductVo" />
  </form-beans>
  <global-exceptions />
  <global-forwards />
  <action-mappings>
  	<action path="/productAction" type="com.company.struts.action.ProductAction" parameter = "method" scope="request" name="productForm">
  		<forward name="viewNewProduct" path="/newProduct.jsp"></forward>
  		<forward name="viewSearchProduct" path="/searchProduct.jsp"></forward>
  	</action>
  </action-mappings>
  <message-resources parameter="com.company.struts.ApplicationResources" />
</struts-config>

在配置文件中配置了action的实现类,以及作为上传数据时用来保存数据的form: productForm

7)          Action处理类ProductAction.java如下:

package com.company.struts.action;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.company.struts.util.Util;
import com.company.struts.vo.ProductVo;

public class ProductAction extends DispatchAction {

	/**
	 * 转到新增界面
	 */
	public ActionForward viewAddForm(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		return mapping.findForward("viewNewProduct");
	}
	/**
	 * 转到查询界面
	 */
	public ActionForward viewSearchForm(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		return mapping.findForward("viewSearchProduct");
	}

	/**
	 * 保存
	 */
	public ActionForward save(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String msg = "SUCCESS";
		ProductVo vo = (ProductVo)form;
		String validateResult = validate(vo);
		if(validateResult != ""){
			msg = validateResult;
		}else{
			Connection conn = null;
			PreparedStatement psmt = null;
			try {
				conn = Util.getPoolConnection();
				String sql = "insert into t_product(product_id,product_name,price) values" +
						"('"+vo.getProductId()+"','"+vo.getProductName()+"','"+Float.parseFloat(vo.getPrice())+"')";
				psmt = conn.prepareStatement(sql);
				psmt.executeUpdate();
			} catch (Exception e) {
				e.printStackTrace();
				msg = e.getMessage();
			} finally{
				if(psmt != null){
					psmt.close();
				}
				if(conn != null){
					conn.close();
				}
			}
		}
		
		request.setAttribute("error", msg);
		return mapping.findForward("viewNewProduct");
	}

	/**
	 *查询数据
	 */
	public ActionForward query(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String projectName = request.getParameter("queryTitle")== null?"":request.getParameter("queryTitle");
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		List<ProductVo> list = new ArrayList<ProductVo>();
		try{
			String sql = "select product_id,product_name,price from t_product where product_name like '%"+projectName+"%' order by product_id desc";
			conn = Util.getPoolConnection();
			psmt = conn.prepareStatement(sql);
			rs = psmt.executeQuery(sql);
			while(rs.next()){
				ProductVo vo = new ProductVo();
				vo.setProductId(rs.getString("product_id"));
				vo.setProductName(rs.getString("product_name"));
				vo.setPrice(rs.getString("price"));
				list.add(vo);
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(psmt != null){
				psmt.close();
			}
			if(conn != null){
				conn.close();
			}
		}
		
		request.setAttribute("List", list);
		return mapping.findForward("viewSearchProduct");

	} 

}

	/**
	 * 上传数据校验
	 */
	public String validate(ProductVo vo){
		String returnStr = "";
		if(vo == null){
			returnStr = "不能传递空值";
		}else{
			if(vo.getProductId() == null || vo.getProductId() == "" 
			|| vo.getProductName() == null || vo.getProductName() == ""
			|| vo.getPrice() == null || vo.getPrice() == ""){
				returnStr = "值不能为空";
			}
		}
		
		return returnStr;
		
	}

8)          保存数据的form,ProductVo如下所示:

package com.company.struts.vo;
import org.apache.struts.action.ActionForm;
public class ProductVo extends ActionForm {
	private static final long serialVersionUID = 1L;
	private String productId;
	private String productName;	
	private String price;
	public String getProductId() {
		return productId;
	}
	public void setProductId(String productId) {
		this.productId = productId;
	}
	public String getProductName() {
		return productName;
	}
	public void setProductName(String productName) {
		this.productName = productName;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
}

9)          newProduct.jsp是录入界面,代码如下:

<%@ page language="java"  pageEncoding="UTF-8"%>
<html>
  <head> <title></title> </head>
  <body>
  <!-- 读取request中的error信息,如果第一次进入,则为null,不弹出框,非首次则根据action判断的结果,弹出不同提示框 -->
	<script type="text/javascript">
		<%
		  Object msg = request.getAttribute("error");
		  if(msg != null){
		  	  String temp = msg.toString();
			  if(!temp.equals("SUCCESS")){
			     String err = "保存失败!原因:"+temp;
			  	%>
			  	alert("<%=err%>");
			  	<%
			  }else{
			  	%>
			  	alert("保存成功!");
			  	<%
			  }
		   }
		  %>
	</script>
	<form action="productAction.action?method=save" name = "newForm" id = "newForm" method = "post">
  		<table width = "500px" align = "center" height = "500px">
	  		<tr>
	  			<td>  
	  				ppprocuctID:  
	  			</td>
	  			<td>
	  				<input type = "text" name = "productId" id = "productId" />
	  			</td>
	  		</tr>
	  		<tr>
	  			<td> 
	  				pprocuctName: 
	  			</td>
	  			<td>
	  				<input type = "text" name = "productName" id = "productName" />
	  			</td>
	  		</tr>

			<tr>
	  			<td> 
	  				price: 
	  			</td>
	  			<td>
	  				<input type = "text" name = "price" id = "price" />
	  			</td>
	  		</tr>
	  		<tr>
	  			<td>
	  				<input type = "submit" value = "summit" />
	  			</td>
	  		</tr>
		</table>
  	</form>  	
  </body>
</html>

10)          searchProduct.jsp是查询结果界面,代码如下:

<%@ page language="java"  pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@page import="com.company.struts.vo.ProductVo"%>
<html>
  <head> 
    <title></title>
  </head>
  
  <body>
  	<form action="productAction.action?method=query" name = "searchForm" id = "searchForm" method = "post">
  		<table width = "500px" align = "center">
	  		<tr>
	  			<td>  
	  				<input type = "text" name = "queryTitle" id = "queryTitle" />
	  				<input type = "submit" name = "submit" id = "submit" value = "submit"/>
	  			</td>
	  		</tr>
		</table>

		<%
			Object obj = request.getAttribute("List");
			if(obj != null){
				List<ProductVo> list = (List<ProductVo>)obj;
				for(int i = 0;i<list.size();i++){
					ProductVo vo = list.get(i);
					%>
						<table width = "500px" align = "center" border = "1px">
					  		<tr>
					  			<td>  
					  				ProductId
					  			</td>
					  			<td>  
					  				<%=vo.getProductId() %>
					  			</td>
					  		</tr>
					  		<tr>
					  			<td>  
					  				ProductName
					  			</td>
					  			<td>  
					  				<%=vo.getProductName() %>
					  			</td>
					  		</tr>
					  		<tr>
					  			<td>  
					  				Price
					  			</td>
					  			<td>  
					  				<%=vo.getPrice() %>
					  			</td>
					  		</tr>
						</table>
					<%
				}
			
			}
		 %>	
  	</form>
  </body>
</html>

至此,一个简单的例子就做完了,在浏览器输入http://localhost:8080/StrutsTest即可访问。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值