초식Struts2 2절

17560 단어 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. 뷰 리스트를 수정합니다.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에서 구성원 변수와 속성 개념을 알아보십시오. 일반적으로 구성원 변수 이름과 속성 이름이 일치합니다.속성은 대응하는setter와getter 방법이 필요합니다.
  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.jar은 웹워크 프레임워크에 도입되기 시작했고, 나중에 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. 기본 연산자
+,-,*,/3목 연산 지원
e. 메소드 호출
   array[0].toLowerCase()
f. 정적 방법 및 상수 호출
   @java.lang.Math@PI
@ 패키지 이름.클래스 이름@상수
@ 패키지 이름.클래스 이름@정적 방법()
g. 컬렉션 필터
집합 속성.{?#this.age>15}
#this는 집합원소로 이해할 수 있다
              ? 필터 조건을 충족시키는 모든 요소를 되돌려주는 것을 가리킨다
^ 첫 번째 조건을 충족시키는 요소를 가리킨다
$는 조건을 충족시키는 마지막 요소를 되돌려주는 것을 가리킨다
h. List 및 Map 상수의 정의
List 상수 "{"tom","scott"}", "{1,2,3}"
Map 상수 "# {"age": 20,"name":"장3"}"
코드 데모
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 형식, 상하문 대상, 표현식이 #로 시작할 때 이 대상에 접근
Struts2에서 3.OGNL 사용
(1) XWork 프레임워크에서 OGNL 개조
XWork는 OGNL의 원래 Root 대상을 교체하는Compount Root 대상을 제공합니다.CompountRoot은 여러 개의 루트 대상을 저장할 수 있는 창고 구조입니다.'name'OGNL 표현식을 입력하면 OGNL 엔진은 창고 꼭대기 대상에서 아래로 속성 값을 찾습니다. 되돌아오는 것을 찾지만 되돌아오는 null을 찾지 못합니다.
context 객체는 OGNL과 같습니다.
(2) ValueStack 객체
ValueStack의 대상 유형은 OgnlValueStack이고 내부는 OGNL 체계 구조를 봉인하고 내부는 접근과 저장 메커니즘을 제공한다.
클라이언트가 요청을 보내면 Struts 프레임워크는Value Stack을 자동으로 만들고 Request에 저장합니다. 키는 "struts입니다.value Stack ", 그리고 Request,session, 응용 프로그램 등 대상을 context 구역에 저장하고, Action 대상을 루트 창고 위에 저장합니다. 요청이 완료되면 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은 페이지, Request, action,session, 응용 프로그램 범위에서 값을 추출하여 표시할 수 있습니다.
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;

         }

}
 
 

좋은 웹페이지 즐겨찾기