我是靠谱客的博主 伶俐台灯,最近开发中收集的这篇文章主要介绍初识 Struts2 第二节,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 扩展列表显示示例 ( 添加分页处理 )

a.在TaskDAO中添加两个方法

package dao;

import java.util.List;

import entity.Task;

public interface TaskDAO{
	//查处数据库中的所有数据
	public List<Task> findAll() throws Exception;
	/**
	 * 分页查询
	 * @param page 查询第几页
	 * @param pageSize 每一页最多显示几条记录
	 * @return
	 * @throws Exception
	 */
	public List<Task> findAll(int page, int pageSize) throws Exception; 
	/**
	 * 统计一共有多少页
	 * @param pageSize 每一页最多显示几条记录
	 * @return
	 * @throws Exception
	 */
	public int countTotalPage(int pageSize) throws Exception;
}

    b .在TaskDAOimpl中写方法实现

package dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.sql.*;
import util.DBUtil;
import dao.TaskDAO;
import entity.Task;

public class TaskDAOimpl implements TaskDAO{

	public List<Task> findAll() throws Exception {
		List<Task> taskList = new ArrayList<Task>();
		Connection conn = DBUtil.getConnection();
		String sql = "select * from t_task";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		while(rs.next()){
			Task task = new Task();
			task.setId(rs.getLong("id"));
			task.setTas_id(rs.getString("tas_id"));
			task.setTas_name(rs.getString("tas_name"));
			task.setTas_begin(rs.getDate("tas_begin"));
			task.setTas_end(rs.getDate("tas_end"));
			taskList.add(task);
		}
		DBUtil.close(conn);
		return taskList;
	}

	public List<Task> findAll(int page, int pageSize) throws Exception {
		List<Task> taskList = new ArrayList<Task>();
		Connection conn = DBUtil.getConnection();
		String sql = "select * from t_task limit ?,?";
		PreparedStatement pstmt = conn.prepareStatement(sql);
                //设置分页查询参数
                int begin = (page-1) * pageSize;
		pstmt.setInt(1, begin);
		pstmt.setInt(2, pageSize);
		ResultSet rs = pstmt.executeQuery();
		while(rs.next()){
			Task task = new Task();
			task.setId(rs.getLong("id"));
			task.setTas_id(rs.getString("tas_id"));
			task.setTas_name(rs.getString("tas_name"));
			task.setTas_begin(rs.getDate("tas_begin"));
			task.setTas_end(rs.getDate("tas_end"));
			taskList.add(task);
		}
		DBUtil.close(conn);
		return taskList;
	}

	public int countTotalPage(int pageSize) throws Exception {
		Connection conn = DBUtil.getConnection();
		String sql = "select count(*) from t_task";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		rs.next();
		int count = rs.getInt(1);
		DBUtil.close(conn);
                //计算最大页,如果没有数据,最大页设为1
                if(count ==0){
			return 1;
		}else if(count % pageSize == 0){
			return count/pageSize;
		}else{
			return count/pageSize + 1;
		}
	}
}

      c.修改TaskAction 添加属性方法

package action;

import java.util.List;

import dao.impl.TaskDAOimpl;

import entity.Task;

public class TaskAction {
	private List<Task> taskList;
	//当前要显示第几页
	private int page=1; //成员变量
	//最大页
	private int totalPage;
	//每页显示3条数据
	public static final int PAGE_SIZE = 3;
	
	public String execute(){
		TaskDAOimpl dao = new TaskDAOimpl();
		try {
			//查询数据
			taskList = dao.findAll(page, PAGE_SIZE);
			//获取最大页,
			//最大页也可根据list集合获得,为了提高效率,最好使用此方法
			totalPage = dao.countTotalPage(PAGE_SIZE);
			return "success";
		} catch (Exception e) {
			e.printStackTrace();
			return "error";
		}
	}
	public List<Task> getTaskList() {
		return taskList;
	}
	public void setTaskList(List<Task> taskList) {
		this.taskList = taskList;
	}
	public int getPage() {
		return page;
	}
	public void setPage(int page) {
		this.page = page;
	}
	public int getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
}

        d.修改视图list.jsp

<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
	<table border="1">
		
		<tr>
			<th>编号</th>
			<th>任务名称</th>
			<th>开始事件</th>
			<th>结束事件</th>
		</tr>
		<c:forEach items="${taskList}" var="list">
			<tr>
				<td>${list.tas_id}</td>
				<td>${list.tas_name }</td>
				<td>${list.tas_begin }</td>
				<td>${list.tas_end }</td>
			</tr>
		</c:forEach>
	</table>
	<c:choose>
		<c:when test="${page <= 1}">
			<a>上一页</a>
		</c:when>
		<c:otherwise>
			<a href="/struts2_showlist/list?page=${page-1 }">上一页<<</a>
		</c:otherwise>
	</c:choose>
	第${page }页,共${totalPage }页
	<c:choose>
		<c:when test="${page >= totalPage}">
			<a>下一页</a>
		</c:when>
		<c:otherwise>
			<a href="/struts2_showlist/list?page=${page+1 }">下一页>></a>
		</c:otherwise>
	</c:choose>
</body>
</html>

     修改完毕,(无法上传图片,所以展示运行效果).

 

 

了解一下 Action 中成员变量和属性概念 , 一般情况下成员变量名和属性名一致 . 属性需要有对应的 settergetter 方法 .

  public class A{

     private String n;// 成员变量名为 n

     // 属性名为 name

     public void setName(String name){...}

     public String getName(){...}

  }

  (1)Struts2 将请求参数值给 Action 传递时 , 属性名与请求参数名保持一致 .

  (2)JSP 视图中 , 使用 EL 表达式获取 Action 数据时 , 属性保持一致 .

2.OGNL 技术的使用

OGNL 技术源于 ognl.jar, ognl.jarwebwork 框架中开始引入 , 后来在 Struts2 才延续下来 .

(1).ognl.jar 有什么作用 .

     Object Graphic Navigation Language   对象图导航语言

ognl.jar 可以便于对复杂对象的访问 , 例如属性获取和设置值 , 方法调用等 . 使用时需要编写 OGNL 表达式 . EL 表达式功能强大 .

(2)OGNL 基本语法

a. 基本类型属性

   “id”, “name”

b. 数组和 List

“array[0]”, “list[1]”

c. Map

   “map.key”, “map[‘key’]”

d. 基本运算符

   +,-,*,/ 三目运算等都支持

e. 方法调用

   array[0].toLowerCase()

f. 静态方法和常量调用

   @java.lang.Math@PI

   @ 包名 . 类名 @ 常量

   @ 包名 . 类名 @ 静态方法 ()

g. 集合过滤

   集合属性 .{?#this.age>15}

              #this 可以理解成集合元素

              ? 指的是返回满足过滤条件的所有元素

              ^ 指的是返回第一个满足条件的元素

              $ 指的是返回最后一个满足条件的元素

h. ListMap 常量的定义

     List 常量 ”{‘tom’,’scott’}”, ”{1,2,3}”

     Map 常量 “#{‘age’:20, ‘name’:’ 张三 ’}”

代码演示

创建FOO实体类

package entity;

import java.util.List;
import java.util.Map;

public class Foo {
	private int id;
	private String name;
	private String[] array;
	private List<String> list;
	private Map<String,String> map;
	private List<Person> pers;
	
	
	public List<Person> getPers() {
		return pers;
	}
	public void setPers(List<Person> pers) {
		this.pers = pers;
	}
	public String[] getArray() {
		return array;
	}
	public void setArray(String[] array) {
		this.array = array;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
	public Map<String, String> getMap() {
		return map;
	}
	public void setMap(Map<String, String> map) {
		this.map = map;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 创建Person实体类

package entity;

public class Person {
	private Address address;
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}
}

 创建Address类

package entity;

public class Address {
	private String street;
	private String zipcode;
	public Address(String street, String zipcode) {
		super();
		this.street = street;
		this.zipcode = zipcode;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getZipcode() {
		return zipcode;
	}
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
}

 创建TestOgnl_01类

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ognl.Ognl;
import ognl.OgnlException;
import org.junit.Test;

import entity.Address;
import entity.Foo;
import entity.Person;

public class TestOgnl {
	@Test
      public void test1(){
    	  Foo foo = new Foo();
    	  foo.setId(100);
    	  foo.setName("张三");
    	  foo.setArray(new String[]{"A","B","C"});
    	  List<String> list = new ArrayList<String>();
    	  list.add("one");
    	  list.add("two");
    	  list.add("three");
    	  foo.setList(list);
    	  Map<String,String> map = 
    		  new HashMap<String, String>();
    	  map.put("one", "壹");
    	  map.put("two", "贰");
    	  map.put("three", "叁");
    	  foo.setMap(map);
    	  List<Person> pers = new ArrayList<Person>();
    	  Person p1 = new Person();
    	  p1.setAddress(new Address("中鼎大厦","100021"));
    	  Person p2 = new Person();
    	  p2.setAddress(new Address("CBD大街","120002"));
    	  pers.add(p1);
    	  pers.add(p2);
    	  foo.setPers(pers);
    	  //利用OGNL对foo对象访问
    	  //Ognl.getValue("OGNL表达式", foo);
    	  try {
    		  //基本类型数据的访问
			Integer id = (Integer)Ognl.getValue("id", foo);
			System.out.println(id);
			String name = (String)Ognl.getValue("name", foo);
			System.out.println(name);
			//数组访问
			String arry = (String)Ognl.getValue("array[0]",foo);
			System.out.println(arry);
			//List集合访问,表达式风格与数组一样
			Ognl.setValue("list[0]", foo, "oneone");
			String lst = (String)Ognl.getValue("list[0]",foo);
			System.out.println(lst);
			//map集合访问,map['key']或map.key
			String mp = (String)Ognl.getValue("map['three']", foo);
			System.out.println(mp);
			//访问pers集合属性值
			String val = (String)Ognl.getValue("'北三环'+pers[0].address.street", foo);
			System.out.println(val);
    	                //方法调用
			String str = (String)Ognl.getValue("array[0].toLowerCase()", foo);
			System.out.println(str);
                        //Ognl.getValue("list.size()", foo);
			//静态方法和常量访问
			Object obj = 
				Ognl.getValue("@java.lang.Math@PI", foo);
			System.out.println(obj);
    	  } catch (OgnlException e) {
			e.printStackTrace();
		}
      }
	
}

创建TestOgnl_02类

package test;

import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import ognl.Ognl;
import ognl.OgnlException;

import entity.Address;
import entity.Foo;
import entity.Person;

public class TestOgnl_02 {
	@Test
	public void test1(){
		Foo foo = new Foo();
		List<Person> pers = new ArrayList<Person>();
		Person p1 = new Person();
		p1.setAge(18);
		p1.setAddress(new Address("中鼎大厦A","10021"));
		
		Person p2 = new Person();
		p2.setAge(13);
		p2.setAddress(new Address("中鼎大厦B","10022"));
	
		Person p3 = new Person();
		p3.setAge(20);
		p3.setAddress(new Address("中鼎大厦C","10023"));
		
		pers.add(p1);
		pers.add(p2);
		pers.add(p3);
		foo.setPers(pers);
		//集合的过滤
		try {
			List<Person> list = (List)
				Ognl.getValue("pers.{?#this.age>15}", foo);
			for(Person p : list){
				System.out.println(p.getAge() +
						p.getAddress().getStreet());
			}
			//List常量定义
			Object obj = Ognl.getValue("{1,2,3}", null);
			System.out.println(obj.getClass());
		} catch (OgnlException e) {
			e.printStackTrace();
		}
	}
}

(3)OGNL 体系结构

主要包含三个组成部分

         OGNL 引擎 : 负责解析 OGNL 表达式 , 访问目标对象 (root) 和上下文对象 (context).

         root 对象 :Object 类型 , 根对象 , 默认访问此对象

         context 对象 :map 类型 , 上下文对象 , 表达式以 # 开始时访问此对象

3.OGNLStruts2 中的使用

         (1)XWork 框架对 OGNL 进行了改造

XWork 提供了一个 CompountRoot 对象 , 替换了 OGNL 原有的 Root 对象 . CompountRoot 是一个栈结构 , 可以存放多个root对象,当输入 ”name” OGNL 表达式时 , OGNL 引擎会从栈顶对象向下一次寻找属性值 , 找到返回 , 找不到返回 null.

        context对象同OGNL一样.

         (2)ValueStack 对象

         ValueStack 对象类型为 OgnlValueStack, 内部封装了 OGNL 体系结构 , 内部提供了访问和存储机制 .

         当客户端发送请求之后 , Struts 框架会自动创建一个 ValueStack, 并存入 request, key”struts.valueStack”, 然后将 request, session,application 等对象存入 context 区域 , Action 对象存入 root 栈顶 , 当请求完毕后 , Action 对象会清除 , 然后将下一个请求的 Action 压入 .

 

4. 使用 OGNL+Struts2 标签重构列表显示示例

修改list.jsp

<table border="1">
		
		<tr>
			<th>编号</th>
			<th>任务名称</th>
			<th>开始事件</th>
			<th>结束事件</th>
		</tr>
		<s:iterator value="taskList" var="list">
			<tr>
				<td><s:property value="#list.tas_id"/></td>
				<td><s:property value="#list.tas_name"/></td>
				<td><s:property value="#list.tas_begin"/></td>
				<td><s:property value="#list.tas_end"/></td>
			</tr>
		</s:iterator>
	</table>
	<s:if test="page <= 1">
			<a>上一页</a>
	</s:if>
	<s:else>
			<a href="/struts2_showlist/list?page=<s:property value="page-1"/>">上一页</a>
	</s:else>
	第<s:property value="page"/>页,共<s:property value="totalPage"/>页
	<s:if test="page >= totalPage">
			<a>下一页</a>
	</s:if>
	<s:else>
			<a href="/struts2_showlist/list?page=<s:property value="page+1"/>">下一页</a>
	</s:else>

 

5. EL 表达式在 Struts2 中的使用

         EL 可以从 page,request,action,session,application 范围中取值并显示 .

         EL 为什么在 JSP 中可以访问到 Action 属性 ?

         ${name} -->

String name = request.getAttribute(“name”);

out.println(name);

Struts2 将原有的 request 对象封装了 , 并重写了 getAttribute 方法 .

 

public class StrutsRequestWrapper extends HttpServletRequestWrapper{

         public Object getAttribute(String key){

                   Object value = super.getAttribute(key);

                   if(value == null){

                         valueStack.findValue(“OGNL表达式”);

                         //Ognl.getValue(“name”, context, root);

                   }

                   return value;

         }

}
 

 

 

最后

以上就是伶俐台灯为你收集整理的初识 Struts2 第二节的全部内容,希望文章能够帮你解决初识 Struts2 第二节所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部