스트럿츠2 프레임워크 유효성 검사 지원

1. 신규 회원의 정보를 입력하는 폼에서 입력한 값의 유효성 검사

2. 입력 폼의 <form action=" ">에 struts.xml 에 입력한 action.class(extends ActionSupport) 넘긴 후

    (※ 입력 폼에서 -> action.class 로  웹 페이지의 모든 파라미터 값들이 자동으로 액션의 프로퍼티 값으로 세팅되게

        하려면 struts.xml <action> </action> 내에 <interceptor-ref name="params"/> 가 지정되야 한다.)

3. struts.xml 에 입력한 action.class 에서 유효성 체크 메소드

 public void validate() {

if()

addFielError("FieldName","ErrorMessage");

}

4. action.calss 에서 validate(){} 메서드 중에 if() 에 지정한 유효성에 충족치 않으면.

(※ 2번과 동일하게 validate() 검사를 하기위해서는 struts.xml <action></action> 내에

 <interceptor-ref name="validation"/>

 <interceptor-ref name="workflow"/>

가 존재하여야 한다. 그래야 5번의 RETURN INPUT 으로 반환하고. SUCCESS RESULT 를 실행하지 않는다.)

5. action.class 안에 execute() 메서드의 return 의 값이 SUCCESS 대신 INPUT 이 반환된다.

      6. INPUT 반환 후 에 result 가 INPUT 일때의 포워딩 설정

<action></action> 내에 <result name="input">/userRegForm.jsp</result>

    <result name="success>/userRegSuccess.jsp</result>

---------- 위의 설명에 충족한 struts.xml 참조 ---------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
  
<struts>
    <package name="actionSupport" namespace="" extends="struts-default">
        <action name="UserRegForm">
            <result>/userRegForm.jsp</result>
        </action>
        <action name="UserRegAction" class="action.UserRegAction">
            <interceptor-ref name="params"/>
            <interceptor-ref name="validation"/>
            <interceptor-ref name="workflow"/>
            <result name="input">/userRegForm.jsp</result>  -> 유효성 검사 실패시 return INPUT 성공시 SUCCESS
            <result name="success">/userRegSuccess.jsp</result>
        </action>
    </package>
</struts>


1. Statement

- JDBC로드 -> DB Connection 연결 -> 쿼리

/* JDBC 드라이브 로드 */
        Class.forName("oracle.jdbc.OracleDriver");

        /* DB연결 */
        Connection conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott")

String query = "INSERT INTO USERINFO(NAME, ID, PASSWORD) VALUES(" + name + "," + id + "," + password + ")";

if(conn != null){

Statement stmt = conn.createStatement();

stmt.executeUpdate(query);

}



2. PreparedStatement

- JDBC로드 -> DB Connection 연결 -> 쿼리

/* JDBC 드라이브 로드 */
        Class.forName("oracle.jdbc.OracleDriver");

        /* DB연결 */
        Connection conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott")

String query = "INSERT INTO USERINFO(NAME, ID, PASSWORD) VALUES(?, ?, ?)";

if(conn != null){
                PreparedStatement pstmt = conn.prepareStatement(query);
                pstmt.setString(1, name);
                pstmt.setString(2, id);
                pstmt.setString(3, password);
                pstmt.executeUpdate();
            }



※ PreparedStatement 가 훨씬 편함.

    예제)

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Driver"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="DBError.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
    <%
        request.setCharacterEncoding("UTF-8");
   
        String name = request.getParameter("name");
        String id = request.getParameter("id");
        String password = request.getParameter("password");
       
        if(name == null || id ==null || password == null){
            throw new Exception("데이타를 입력하세요");
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
       
        String DBurl = "jdbc:oracle:thin:@localhost:1521:orcl";
        String DBuser = "scott";
        String DBpassword = "scott";
        try{
            Class.forName("oracle.jdbc.OracleDriver");
            conn = DriverManager.getConnection(DBurl, DBuser, DBpassword);
           
            String query = "INSERT INTO USERINFO(NAME, ID, PASSWORD) VALUES(?, ?, ?)";
           
            if(conn != null){
                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, name);
                pstmt.setString(2, id);
                pstmt.setString(3, password);
                pstmt.executeUpdate();
            }
            else {
                throw new Exception("DB 연결 실패!");
            }
        }
        finally{
            pstmt.close();
            conn.close();
        }
        response.sendRedirect("SubscriptionResult.jsp");
        %>
</body>
</html>


- JSTL 의 함수 라이브러리는 익스프레이션 언어(EL) 식 안에서 사용할수 있는 함수 라이브러리

이 함수들은 주로 문자열을 처리하는 일을 하며, 자바 JDK 라이브러리의 java.lang.String 클래스에 속하는 메서드들과 거의 같은 기능을 제공한다.

예) substring, trim

 

- 사용법

 

1. Taglib 등록

<%@ taglib prefix="fn" uri=http://java.sun.com/jsp/jstl/functions %>

 

2. 함수 라이브러리의 함수들

1) substring(str, index1, index2) : str 의 index1 부터 index2 - 까지의 문자열 리턴

2) substringAfter(str1, str2) : str1 에서 str2 를 찾아서 그 후의 부분문자열 리턴

3) substringBefore(str1, str2) : str1 에서 str2 를 찾아서 그 전의 부분문자열 리턴

4) toUpperCase(str) : 모든 소문자를 대문자로 치환한 값을 리턴

5) toLowerCase(str) : 모든 대문자를 소문자로 치환한 값을 리턴

6) trim(str) : 문자열에서 앞뒤 공백 문자를 제거한 결과를 리턴

7) replace(str, src, dest) : str 문자열에 포함된 src 를 dest 로 치환한 결과를 리턴

8) indexOf(str1, str2) : str1에 포함된 str2의 시작 인덱스를 리턴

9) startsWith(str1, str2) : str1이  str2 로 시작하면 true, 그렇지 않으면 false 리턴

10) endsWith(str1, str2) : str1이 str2 로 끝나면 true, 그렇지 않으면 false 리턴

11) contains(str1, str2) str1이 str2를 포함하면 true, 그렇지 않으면 false 리턴(대소문자 구분)

12) containslgnoreCase(str1, str2) : str1이  str2를 포함하면 true, 그렇지 않으면 false 를 리턴,

contains 함수와는 달리 대소    문자 구별하지 않고 비교함.

13) split(str1, str2) : str1을 str2를 기준으로 분리해서 만든 부문자열들의 배열을 리턴

14) join(str1, str2) : arr 배열의 모든 항목을 합쳐서 리턴, 항목사이에는 str2가 들어옴

15) escapeXml(str) : HTML 문법에 의한 특수문자로 취급되는 모든 문자를 이스케이프 시퀀스로 치환하여 결과를 리턴

16) length(obj) : obj가 문자열이면 문자열의 길이, List 나 Collection 이면 항목의 수를 리턴.

 

3, 사용법

<c:set var="greeting" value="How Are You?" />

기본출럭 : ${greeting}

대문자 : ${fn:toUpperCase(greeting)}

소문자 : ${fn:toLowerCase(greeting)}

- 등록할 파일 : TLD 파일(ex : 웹어플리케이션/web-app/WEB-INF/tld/math-functons.tld)

 

- TLD 파일의 골격(TLD 파일 생성하기)

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

                                (TLD 문법의 식별자)                (TLD 문법의 버전)

<tlib-version>1.0</tlib-version> -> 태그 라이브러리의 버젼

<short-name>math</short-name> -> 태그 라이브러리의 이름

<function>

<name>squareroot</name> ->  EL 함수의 이름(나름대로 정한 EL 함수의 명칭)

<function-class>java.lang.Math</function-class> -> 자바 정적메서드(static method)가 속하는 클래스 풀네임

<function-signature>double sqrt(double)</function-signature> -> 정적 메서드의 시그니처

</function>

</taglib>

 

- TLD 파일 생성을 하여도 바로 호출할 수 없다. web.xml 파일에 TLD 파일을 등록해야한다.

<web-app>

<taglib>

<taglib-uri>/math-functions.tld</taglib-uri> -> TLD 파일의 식별자 명칭

<taglib-location>tlds/math-functions.tld</taglib-location> -> TLD 파일의 실제 경로명

</taglib>

</web-app>

 

- JSP 페이지에 호출하기 위해 지시어(<%@ %>) 사용해서 등록하기

<%@taglib uri="/math-functions.tld" prefix="m" %>

 

- JSP 페이지에서 호출해서 사용하기

${m:squareroot(4)}

 설명 : java.lang.Math 클래스의 sqrt 메서드를 'squareroot' 라는 이름의 EL 함수로 등록한다!! 잊어버리자 말자.

 

----------------------------------------------------------------------------------------------------

※ 테스트를 하는데 web.xml 에 <taglib> 태그에서 오류가 발생!!!

    google 검색 결과 답변은...

web.xml 이부분에서
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

빨간색으로 나타낸 부분을 지우면 된다.
XML 스키마나 DTD 지정은 JSP/Servlet 어플리케이션 지정할 때 매우 민감하게 작용합니다.
요즘에는 Servlet Spec 2.3 이 보통이고, 최근들어 2.4도 많이 쓰는 추세입니다. 2.2는 안쓰게 된지 오래됐습니다.
그러니까 처음에 지정한 DOCTYPE에서 2.2로 지정하면 안됩니다.(DOCTPYE 삭제해버린다) 
Servlet 스펙 2.4(가장 최신)에서는 web.xml 에서 TLD 파일을 지정하는 기능이 없다.

내 이클립스에서 생성된 web.xml version=2.5 에서 오류가 발생하는 것이다. 

해결방법

1. 위의 빨간 밑줄 부분을 삭제한다.

2. web.xml 에 TLD 파일 지정하지않고, 바로 JSP 에서 <%@ taglib uri="tld파일경로 지정" prefix="c" %>

    TLD 설치경로 : 웹 어플리케이션 디렉터리/WEB-INF 서브디렉터리 아래이면 어느 곳이든 상관 없다.

EX> 자바빈 클래스의 예

public class PersonInfo {

private String name;

private int age;

private String tell;

/* Getter & Setter */

    /* getter & setter */
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setTell(String tell) {
        this.tell = tell;
    }
    public void setTell(String tell) {
        this.tell = tell;
    }

} // end - class

 

EX> 자바빈 프로퍼티 입력 JSP

<%

PersonInfo personInfo = new PersonInfo();

personInfo.setName("daniel");

personInfo.setAge("27");

personInfo.setTell("177");

request.setAttribute("PERSONINFO", personInfo);

RequestDispatcher dispatcher =

request.getRequestDispatcher("-- forward 시킬 JSP 경로 --");

dispatcher.forward(request, response);

%>

 

EX> 자바빈 프로퍼티 받아서 출력하는 JSP

이름 : ${PERSONINFO.name}<br>

나이: ${PERSONINFO.age}<br>

번호: ${PERSONINFO.tell}<br>

 

※ 제발, 까져먹지말자...

- JSP/Servlet 기술에서 사용되는 네 종류의 애트리뷰트

① Page

② request

③ session

④ application

 

- EL 식 안에 있는 데이터 이름이 해석되는 순서

Page -> Request -> Session -> Application

 

- 같은 이름의 애트리뷰트 존재시 콕 짚어서 특정 애트리뷰트를 출력하고 싶을 때 사용법

  데이타 영역의 스코프와 함께 표시한다.

${pageScope.SUM}    ${requestScope.RESULT}    ${sessionScope.CART}    ${application.DB_NAME}

이렇게? 이런 일이 있을까?

 

 

<web-app>

<context-param>

<param-name>MY_NAME</param-name>

<param-value>DANIEL</param-value>

</context-param>

</web-app>

 

- 웹 어플리케이션 안에서 초기화 파라미터 값을 어디에서든 읽어 올수 있다.

EX) <%= application.getInitParameter("MY_NAME") %>

<web-app>

<servlet>

-- JSP 페이지의 본래의 URL 경로명이 들어갈 부분 ---

<servlet-name>winners-jsp</servlet-name>

<jsp-file>/Winners.jsp</jsp-file>   -> JSP 페이지의 본래의 URL경로명

<init-param>

<param-name>FILE_NAME</param-name>

<param-value>winner-list.txt</param-value>

-- 해당 JSP 페이지에서 getInitParameter 메서드를 호출해서 가져올수 있다 --

</init-param>

</servlet>

<servlet-mapping>

-- JSP 페이지를 호출할 때 사용할 URL 경로명이 들어갈 부분 --

<servlet-name>winners-jsp</servlet-name>

<url-pattern>/winners</url-pattern> -> JSP페이지의 새로운 URL 경로명(별칭)

</servlet-mapping>

</web-app>

 

EX) String filename = getInitParameter("FILE_NAME");

<jsp-file></jsp-file>경로로 jsp를 호출 할때만 getInitParameter(); 가 정상 호출 된다.

<%@page import="org.apache.jasper.tagplugins.jstl.core.Catch"%>
<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>::: JSP_JDBC_EX ::::</title>
</head>
<body>
MEMBER 테이블의 내용
<table width="100" border="1">
    <tr>
        <td>이름</td>
        <td>아이디</td>
        <td>이메일</td>
    </tr>
   
<%
        /* 1.JDBC 드라이버 로딩(등록) */
        Class.forName("oracle.jdbc.OracleDriver");
       
        Connection conn = null;
        Statement stmt    = null;
        ResultSet rs        = null;
       
        try {
            String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:XE";
                                    /* jdbc:oracle:thin:@hostid:port:SID */
            String dbUser = "HR";
            String dbPass = "HR";
           
            String query = "SELECT * FROM MEMBER ORDER BY MEMBERID";
           
            /* 2.데이터 베이스 커넥션 생성 */
            conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
           
            /* 3.Statement 생성 */
            stmt = conn.createStatement();
           
            /* 4.쿼리실행 */
            rs = stmt.executeQuery(query); // SELECT
                     // executeUpdate - INSERT, UPDATE, DELETE ( RETURN 값 - INT )
           
            /* 5.쿼리 실행 결과 출력 */
              while(rs.next() ) {
        %>
<tr>
    <td><%= rs.getString("NAME") %></td>
    <td><%= rs.getString("MEMBERID") %></td>
    <td><%= rs.getString("EMAIL") %></td>
</tr>
        <%
              }           
           
        } catch (SQLException ex) {
            out.println(ex.getMessage() );
            ex.printStackTrace();
        } finally {
           
            /* 6.사용한 Statement 종료 */
            if ( rs != null )
                try {
                    rs.close();
                } catch (SQLException ex) {}
           
            if ( stmt != null )
                try {
                    stmt.close();   
                } catch (SQLException ex) {}
           
            /* 7.커넥션 종료 */
            if ( conn != null )
                try {
                    conn.close();
                } catch (SQLException ex) {}
                }
%>
</table>

</body>
</html>


- Request 기본 객체는 JSP 페이지에서 가장 많이 사용되는 기본객체로 웹브라우저의 요청과 관련이 있다.

  웹 브라우저(사이트 주소입력) -> 해당 웹 서버(요청 정보 전송)

  클라이언트가 전송한 요청 정보를 제공하는 것이 바로 Request 이다.

 

#### Request 의 제공하는 기능 ####

  - 클라이언트(웹 브라우저)와 관련된 정보 읽기

  - 서버와 관련된 정보 읽기

-------------------------------------------------------------------------------

* 클라이언트 및 서버 정보 관련 메서드 *

gerRemoteAddr()               :  클라이언트의 IP주소

getContentLength()            :  클라이언트가 전송한 요청 정보의 길이

getCharacterEncoding()     :  클라이언트가 요정 정보를 전송할 때 사용한 캐릭터 인코딩

getContentType()               :  클라이언트가 요청 정보를 전송할 때 사용한 컨텐트의 타입

getProtocol()                     :  클라이언트가 요청한 프로토콜

getMethod()                      :  웹 브라우저가 정보를 전송할 때 사용한 방식(GET/POST) 

getRequestURI()                :  웹 브라우저가 요청한 URL에서의 경로

getContextPath()                :  JSP 페이지가 속한 웹 어플리케이션의 컨텍스트 경로

getServerName()                :  연결할 때 사용한 서버 이름

getServerPort()                  :  서버가 실행 중인 포트 번호

-------------------------------------------------------------------------------

 

  - 클라이언트가 전송한 요청 파라미터 읽기

-------------------------------------------------------------------------------

* 파라미터 읽기 메서드 *

getParameter(String name) / returnType - String                      :  이름이 name 인 파라미터의 값을 구함.

getParameterValues(String name) / returnType - String[]         :  이름이 name 인 모든 파라미터의 값을 배열로 구함.

getParameterNames()                  / returnType - Enumeration   :  웹 브라우저가 전송한 파라미터의 이름을 구함.

getParameterMap()                     / returnType - Map              :  웹 브라우저가 전송한 파라미터의 맵을 구한다.

<Key, Value>

 ------------------------------------------------------------------------------

 

  - 클라이언트가 전송한 요청 헤더 읽기

  - 클라이언트가 전송한 쿠키 읽기

  - 속성 처리

  

+ Recent posts