You are on page 1of 63

Struts

kwon37xi@yahoo.co.kr
http://kwon37xi.egloos.com
: Struts 1.2.7
: 2005/06/14 ~

1. ?................................................................................................2
2. .....................................................................5
3. ..................................................................................7
4. ........................................................................................................15
5. ...............................................................................................28
6.RequestProcessor .........................................................................................29
7.Tiles ...............................................................................................................31
8.Validator .......................................................................................................36
9. (Exception Handling)...........................................................................45
10. (Logging)..........................................................................51
11.ActionForm ............................................................................................53
12.ActionForward .......................................................................................55
13.ActionMapping ......................................................................................57
14.Action .....................................................................................................59
15.PlugIn .....................................................................................................62
16. ?...............................................................................................................63

1. ?
Model 1
Model 1 , JSP ( ,
) , .
.
(JSP 10 ?)
,
,
( ).
, .
, Model 1 JSP ()
HTML , HTML

.
.
, ,
.
. .

1 Model 1

Model 2
Model 2 . 2
.
, , JSP
.
, web.xml .
2 Model 2 MVC(Model-View-Controller)
.

2 Model 2
1. Model 2 Controller .
, .
2. .
. request session, application
setAttribute() .
3. .
4. HTML View(, JSP )
.
5. View JSP getAttribute() .
Model-View-Controller Model 2 .

MVC
MVC .

MVC Model . Model


Java Beans .

View JSP . JSP ~

Controller . Servlet
.

?
(http://struts.apache.org) MVC Controller
.
MVC .

3
MVC MVC .
ActionServlet, RequestProcessor, ActionForm, Action
, .
Model View MVC .

ActionServlet : Action( )
struts-config.xml Servlet .

RequestProcessor : , struts-config.xml Action


, request response .
Action URL .
http://localhost:8080/login.do /login.do strutsconfig.xml /login (.do ) (<action>)
.

ActionForm : GET POST


( ) Java Bean . ActionForm
ActionForm Action .

Action : . .
Action Model
.

.
. .
.
.
.

2.
http://struts.apache.org .

WEB-INF/lib Batang struts.jar lib/*.jar


.

WEB-INF/config/struts-config.xml .

WEB-INF/tlds/ *.tld .

struts-config.xml *.tld WEB-INF/ .

WEB-INF/web.xml .

struts-blank.war ,
.
. , config tlds
(
WEB-INF/ .

web.xml . J2EE 1.3, JSP 1.2, Servlet 2.3 web.xml


. web.xml .

<?xml version="1.0" encoding="utf-8"?>


<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name> </display-name>
<!-- ActionServlet . -->
<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/config/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<!-- ActionServlet . -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- *.do URL ActionServlet . -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- JSP . -->
<security-constraint>
<web-resource-collection>
<web-resource-name>PreventViewingJSPs</web-resource-name>
<description> JSP .</description>
<url-pattern>*.jsp</url-pattern>

<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name></role-name>
</auth-constraint>
</security-constraint>
</web-app>

<servlet-mapping> <url-pattern>*.do</url-pattern> .do


ActionServlet .

ActionServlet ActionServlet struts-config.xml


.

<security-constraint> *.jsp .
JSP .

struts-config.xml

<?xml version="1.0" encoding="UTF-8" ?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings />
<controller />
<message-resources />
<plug-in />
</struts-config>

struts-config.xml .
.
<action-mappings /> <global-forwards /> .
.
( XML DTD Servlet Spec 2.3 web.xml
).
<data-sources /> .

3.
.
ContextPath . .

JSP
JSP .
Model HTML JSP
.
web.xml *.jsp (<securityconstraint /> ). *.jsp .
HTML JSP .

WEB-INF/config/struts-config.xml .

<?xml version="1.0" encoding="ISO-8859-1" ?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<!-- . -->
<struts-config>
<action-mappings>
<action
path="/Welcome"
forward="/Welcome.jsp"/>
</action-mappings>
</struts-config>

Model Action JSP


.

<action> path=/Welcome : URL http://localhost:8080/ContextPath/Welcom.do


. URL .do path .

<action> forward=/Welcome.jsp :
Welcome.jsp .

Welcome.jsp .

<%@page contentType="text/html; charset=euc-kr"%>


<!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=euc-kr">
<title>Welcome Page</title>
</head>
<body>
<h1>~</h1>
!<br />
Struts .
</body>
</html>

Action JSP
.
.

Forward Redirect
JSP/Servlet
. Forward Redirect.
.

Forward : Web Container .


. , URL URL
. . Forwad
request response .

Redirect : Web Container Redirect


. URL .
. request response .

Action
.
(Model) Action .
Action org.apache.struts.action.Action ,
execute() .

Action

GET/POST ( Action
ActionForm ).

Model Java Class .

Model Java .

request, session, application , View


.

RequestProcessor Action .

Action .

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActionClass extends Action {
// execute .

public ActionForward execute(ActionMapping mapping,


ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
// ..

return forward;

, .

WEB-INF/config/struts-config.xml .

<!-- -->
<struts-config>
<action-mappings>
<action
path="/Welcome"
forward="/Welcome.jsp"/>
<!-- Forward -->
<action
path="/login1/logInForm"
forward="/login1/logInForm.jsp"/>
<!-- Action -->
<action
path="/login1/logIn"
type="strutsguide.actions.Login1Action"
validate="false"
>
<!-- / View -->
<forward name="success" path="/login1/logInSuccess.jsp" redirect="true" />
<forward name="fail" path="/login1/logInFail.jsp" />
</action>
</action-mappings>
</struts-config>
/login1/logInForm.jsp .
<%@page contentType="text/html; charset=euc-kr"%>
<!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=euc-kr">
<title> </title>
</head>
<body>
<h1> </h1>
<!-- "login.do" . -->
<form name="login" method="get" action="login.do">
Username : <input name="username" type="text" size="16" /><br />
Password : <input name="password" type="password" size="16" /><br />
<input type="submit" />
</form>
</body>
</html>
/login1/logInSuccess.jsp .
<%@page contentType="text/html; charset=euc-kr"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"


"http://www.w3.org/TR/html4/loose.dtd">
<%-- Action Session userInfo . --%>
<jsp:useBean class="strutsguide.beans.UserInfoBean" id="userInfo" scope="session"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title> </title>
</head>
<body>
<h1> </h1>
: <jsp:getProperty name="userInfo" property="userName"/><br />
: <jsp:getProperty name="userInfo" property="phone"/><br />
: <jsp:getProperty name="userInfo" property="email"/><br />
</body>
</html>
/login1/logInFail.jsp .
<%@page contentType="text/html; charset=euc-kr"%>
<!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=euc-kr">
<title> </title>
</head>
<body>
<h1> </h1>
.<br />
<a href="logInForm.do"> </a>
</body>
</html>
Model LogInProcess.java .

HashMap , logInForm.do
,
null .
Singleton
.
package strutsguide.beans;
import java.util.HashMap;
/**
*
*/
public class LogInProcess {
/** */
private HashMap userInfos = null;
/** */
private HashMap userPasswords = null;
/** LogInProcess */
private static LogInProcess instance = new LogInProcess();

10

/** . */
private LogInProcess() {
userPasswords = new HashMap();
userInfos = new HashMap();
// .
// .
userPasswords.put("kwon37xi", "1234");
userInfos.put("kwon37xi", new UserInfoBean("kwon37xi", "011-222-4444", "kwon37xi@yahoo.co.kr"));
userPasswords.put("narae", "n111");
userInfos.put("narae", new UserInfoBean("narae", "010-333-5555", "narae@mymail.xxx"));

userPasswords.put("woori", "w222");
userInfos.put("woori", new UserInfoBean("woori", "010-777-9999", "woori@yourmail.ooo"));

/**
* LogInProcess .
*/
public static LogInProcess getInstance() {
return instance;
}
/**
* , UserInfoBean .
*
* @param userName
* @param password
* @return UserInfoBean . null
*/
public UserInfoBean logIn(String userName, String password) {
String userPassword = (String)userPasswords.get(userName);
// null
if (userPassword == null) {
return null;
}
// null
if (!userPassword.equals(password)) {
return null;
}

UserInfoBean userInfo = (UserInfoBean)userInfos.get(userName);


return userInfo;

UserInfoBean.java .

package strutsguide.beans;
public class UserInfoBean {
/** */
private String userName = null;
/** */
private String phone = null;
/** */
private String email = null;

11

/** */
public UserInfoBean() {
// do nothing;
}
/** */
public UserInfoBean(String userName, String phone, String email) {
this.userName = userName;
this.phone = phone;
this.email = email;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}

public void setEmail(String email) {


this.email = email;
}

LogIn1Action.java .

package strutsguide.actions;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import strutsguide.beans.UserInfoBean;
import strutsguide.beans.LogInProcess;
public class Login1Action extends Action {
/**
* .
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
LogInProcess logInProcess = LogInProcess.getInstance();
// .

12

String userName = request.getParameter("username");


String password = request.getParameter("password");
UserInfoBean userInfo = logInProcess.logIn(userName, password);
ActionForward forward = null;
if (userInfo == null) {
// userInfo null . .
// .
forward = mapping.findForward("fail");
} else {
// null . session .
HttpSession session = request.getSession();
session.setAttribute("userInfo", userInfo);

// .
forward = mapping.findForward("success");

// View .
return forward;

, . http://localhost:8080/ContextPath/login1/logInForm.do strutsconfig.xml <action path="/login1/logInForm" forward="/login1/logInForm.jsp"/>


login1/logInForm.jsp .

4
LogInProcess.java logInForm.jsp <form
action="logIn.do"> Login1Action .
Login1Actioin , LogInProcess logIn()
.
mapping.findForward(success); struts-config.xml
.
<!-- Action -->
<action
path="/login1/logIn"
type="strutsguide.actions.Login1Action"
validate="false"
>
<!-- / View -->
<forward name="success" path="/login1/logInSuccess.jsp" redirect="true" />
<forward name="fail" path="/login1/logInFail.jsp" />
</action>

success /login1/logInSuccess.jsp
(redirect=true) . jsp URL

13

.( .
.) -- web.xml *.jsp .
.

5
fail /login1/logInFail.jsp .
URL /login1/login.do .

6
URL login.do .
form method GET
. POST
.
MVC .

14

4.
. .
.
Action ActionForm
.
ActionForm Action
.
ActionMessages . ActionMessages ActionForm
Action JSP
.

ActionForm

HTML ("<input type='text' name='phone'/>" ) ActionForm


(ActionForm setPhone(request.getAttribute(phone) ),
()
Action .

: ActionForm ( - )
! - . ActionForm
.

ActionForm ..

org.apache.struts.action.ActionForm .

HTML Form Input name(<input name=/>) .

Setter Getter . Setter Getter .

String boolean .
String . ActionForm
int
.

ActionForm public void reset


(ActionMapping mapping, HttpServletRequest request) .

ActionForm Action public


ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
. (ActionErrors )

struts-config.xml , ActionForm . ActionForm


Action .

<struts-config>
<form-beans>
<form-bean
name=""
type="myproject.form.FormClass"/>
</form-beans>
</struts-config>

ActionMessages ...

ActionMessages ( ActionForm Action)


.
.

15

, ActionForm ActionMessages . login1


, username password
ActionForm
.
, POST , JSP Action
JSP .

WEB-INF/config/struts-config.xml . login1
. . .

<?xml version="1.0" encoding="UTF-8" ?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<!-- Login2 ActionForm -->
<form-bean name="login2Form"
type="strutsguide.forms.Login2Form">
</form-bean>
</form-beans>
<global-forwards>
<!-- Login2 global forward -->
<forward name="login2Form" path="/login2/loginForm.do"
redirect="true" />
</global-forwards>
<action-mappings>
<action path="/Welcome" forward="/Welcome.jsp" />
<!-- // Login2 Action Mapping -->
<!-- -->
<action path="/login2/loginForm"
forward="/login2/loginForm.jsp" />
<!-- -->
<action path="/login2/login"
type="strutsguide.actions.Login2Action" name="login2Form"
validate="true" scope="request" input="/login2/loginForm.jsp">
</action>
<!-- -->
<action path="/login2/logout"
type="strutsguide.actions.LogoutAction" />
<!-- // Login2 Action Mapping -->
<action path="/login1/logInForm"
forward="/login1/logInForm.jsp" />
<action path="/login1/logIn"
type="strutsguide.actions.Login1Action" validate="false">
<forward name="success" path="/login1/logInSuccess.jsp"
redirect="true" />
<forward name="fail" path="/login1/logInFail.jsp" />
</action>
</action-mappings>
<!--

16

login2 .
strutsguide.resource application.properties .

-->
<message-resources parameter="strutsguide.resources.application" />
</struts-config>
/login2/loginForm.jsp .
<%@page contentType="text/html; charset=euc-kr"%>
<%@taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
<%@taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
<%@taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title> </title>
</head>
<body>
<h1> </h1>

<logic:present name="userInfo" scope="session">


<%-session "userInfo" Attribute .
--%>
<b> .</b><br />
: <bean:write name="userInfo" property="userName" scope="session"/><br />
: <bean:write name="userInfo" property="phone" scope="session"/><br />
: <bean:write name="userInfo" property="email" scope="session"/><br />
<html:link action="/login2/logout"></html:link>
</logic:present>
<logic:notPresent name="userInfo" scope="session">
<%-session "userInfo" Attribute .
--%>
<b> .</b><br/>
</logic:notPresent>
<!-- "login.do" . -->
<html:form action="/login2/login" method="POST" focus="username">
<html:messages id="msg" message="true">
<%-ActionMessages.GLOBAL_MESSAGE ActionMessage
.
--%>
<b><bean:write name="msg"/></b> <br />
</html:messages>
Username : <html:text property="username"/>
<html:messages id="msg" property="invalidUsernameError">
<%-invalidUsernameError ActionMessage
.
--%>
<b><bean:write name="msg"/></b>
</html:messages>
<br />

17

Password : <html:password property="password" redisplay="false"/>


<html:messages id="msg" property="invalidPasswordError">
<%-invalidPasswordError ActionMessage
.
--%>
<b><bean:write name="msg"/></b>
</html:messages>
<br />
<html:submit value=""/> &nbsp; <html:reset value="" />
</html:form>
</body>
</html:html>
Model LogInProcess.java

Action .
, . Action
, login2 .

UserInfoBean.java .

Action Login2Action.java .

package strutsguide.actions;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import strutsguide.beans.LogInProcess;
import strutsguide.beans.UserInfoBean;
import strutsguide.forms.Login2Form;
/**
* Login2 .
*/
public class Login2Action extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LogInProcess logInProcess = LogInProcess.getInstance();
// ActionForm .
Login2Form login2Form = (Login2Form) form;
// .
String userName = login2Form.getUsername();
String password = login2Form.getPassword();
UserInfoBean userInfo = logInProcess.logIn(userName, password);
ActionForward forward = null;

18

if (userInfo == null) {
// userInfo null .
ActionMessages messages = new ActionMessages();
// .
// <html:messages id="msg" message="true"> JSP .
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"error.invalidLogin"));
// request
saveMessages(request, messages);
// .
// <action input="" /> input .
return mapping.getInputForward();
}
// null . session .
HttpSession session = request.getSession();
session.setAttribute("userInfo", userInfo);
// .
// <forward name="login2Form" /> .
forward = mapping.findForward("login2Form");

return forward;

loginForm.jsp Login2Action
Login2Form.java ActionForm .

package strutsguide.forms;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
/**
* Login2Action Action Form
*
*/
public class Login2Form extends ActionForm {
/** */
private String username = null;
/** */
private String password = null;
/**
*
* @param username
*/
public void setUsername(String username) {
this.username = username;
}
/**

19

*
* return
*/
public String getUsername() {
return username;
}
/**
*
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
*
*/
public String getPassword() {
return password;
}
/**
* .
*
* validate() setUsername() setPassword()
* username password .
*
* @param mapping
* @param request HTTP Request
* @return
*/
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
//
if (username == null || username.length() == 0) {
errors.add("invalidUsernameError",
new ActionMessage("error.invalidUsername", " ."));
} else if (username.indexOf(" ") >= 0 || username.indexOf("\t") >= 0 ||
username.indexOf("\n") >= 0) {
errors.add("invalidUsernameError",
new ActionMessage("error.invalidUsername", " ."));
}
//
if (password == null || password.length() == 0) {
errors.add("invalidPasswordError",
new ActionMessage("error.invalidPassword"));
}

/*
* ActionErrors errors null ActionMessage
* .
*/
return errors;

LogoutAction.java .

package strutsguide.actions;
import org.apache.struts.action.*;

20

import javax.servlet.http.*;
/**
* .
*/
public class LogoutAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
// .
session.invalidate();

// <forward name="login2Form" path="/login2/loginForm.do" />


// .
return (mapping.findForward("login2Form"));

. /WEBINF/classes/strutsguide/resources/application.properties .

error.invalidUsername= . {0}
error.invalidPassword= .
error.invalidLogin= .

, *.properties .
. Java native2ascii
. .
error.invalidUsername=\uc798\ubabb\ub41c \uc0ac\uc6a9\uc790\uba85\uc785\ub2c8\ub2e4. {0}
error.invalidPassword=\ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud558\uc9c0
\uc54a\uc558\uc2b5\ub2c8\ub2e4.
error.invalidLogin=\ub85c\uadf8\uc778 \uc0ac\uc6a9\uc790\uba85\uc774 \uc874\uc7ac\ud558\uc9c0
\uc54a\uac70\ub098 \ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.

, .
/login2/loginForm.do .

7
, /login2/loginForm.do struts-config.xml <action
path="/login2/loginForm" forward="/login2/loginForm.jsp" /> /login2/loginForm.jsp

21

.
.

8 username password
<form-bean name="login2Form"
type="strutsguide.forms.Login2Form"/> ActionForm Login2Form .
Action ActionForm .
<action path="/login2/login"
type="strutsguide.actions.Login2Action" name="login2Form"
validate="true" scope="request" input="/login2/loginForm.jsp">
</action>

/login2/login.do Action login2Form <form-bean>


ActionForm (name=login2Form)
(validate=true) ActionForm request (scope=request) ActionForm
/login2/loginForm.jsp
(input=/login2/loginForm.jsp) .
Login2Form.setUsername() Login2Form.setPassword()
username password .
Login2Form.validate() username password .
username ,
. validate() ActionErrors
ActionMessage , .
RequestProcessor Login2Form.validate() ActionErrors .
ActionErrors null ActionMessage Action
Action
input=/login2/loginForm.jsp /login2/loginForm.jsp .
URL /login2/loginForm.jsp /login2/login.do
. .
ActionForm scope=request
request .
. ActionErrors .

.

22

9
ActionForm . Action .
Action ActionMessages
return mapping.getInputForward();
input=/login2/loginForm.jsp
.
?
Action ActionMessages , ActionForm.validate() ActionErrors
. ? .
, .
.

10
URL /login2/loginForm.do . login.do
forward = mapping.findForward("login2Form"); login2Form <forward>
, login2Form .
<global-forwards>
<!-- Login2 global forward -->
<forward name="login2Form" path="/login2/loginForm.do"
redirect="true" />
</global-forwards>

<global-forwards> .
<forward> Action . , <global-forwards>
<forward> (name ) <forward>
.

23

login2Form , redirect=true
.
(/login2/logout.do) <action path="/login2/logout"
type="strutsguide.actions.LogoutAction" /> LogoutActon
login2Form
.
, , ,
/login2/loginForm.jsp <html:form>
.
HTML
.


JSP (Scriptlet) JSP
. JSP
.
*.tld
.
. Model 1
() . JSP

.
Model 2 . Action
JSP .
JSTL .
. .
JSP
, Model 2 .
Html, Logic, Bean, Nested, Tiles
. . .
/WEB-INF/tlds/*.tld uri JSP
. .
<%@taglib
<%@taglib
<%@taglib
<%@taglib

uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%>
uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>

prefix . .
uri *.tld <uri>...</uri> http://struts.apache.org/...
. 2.3 ( 3.x) web.xml *.tld uri
2.3 ( 4.x ) . tld
WEB-INF/tlds . struts.jar *.tld
.
*.tld . *.tld web.xml
. WEB-INF/tlds *.tld .
http://struts.apache.org/userGuide/index.html .

HTML - ActionForm

/login2/loginForm.jsp HTML <html:>

24

.
/login2/loginForm.do HTML
.
<!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=euc-kr">
<base href="http://localhost:8080/StrutsGuide1/login2/loginForm.jsp">
<title> </title>
</head>
<body>
<h1> </h1>
<b> .</b><br/>
<!-- "login.do" . -->
<form name="login2Form" method="POST"
action="/StrutsGuide1/login2/login.do;jsessionid=56BA04512188FA92077A907127CF1D34">
Username : <input type="text" name="username" value="">
<br />
Password : <input type="password" name="password" value="">
<br />
<input type="submit" value=""> &nbsp; <input type="reset" value="">
</form>
<script type="text/javascript" language="JavaScript">
<!-var focusControl = document.forms["login2Form"].elements["username"];
if (focusControl.type != "hidden" && !focusControl.disabled) {
focusControl.focus();
}
// -->
</script>
</body>
</html>

JSP .

<html:html>
<html> .

<html:base/>

<base href=/> . URL JSP ,


JSP URL . JSP
<html:base/> .

<html:form action="/login2/login" method="POST" focus="username">

<form> . action <form> struts-config.xml <action path=/>


path . method GET POST . focus
.
action=/login2/login struts-config.xml <action path=/login2/login
name=login2Form/> name <form-bean name=login2Form ... /> .
ActionForm validate() , ActionForm request session <action
scope=/> , <html:> <input>
.

<html:text property="username"/>

25

<input type=text> . property=username <input> name=username


ActionForm session request ActionForm getUsername()
input value .

<html:password property="password" redisplay="false"/>

<input type=password/> . property <html:text> . , redisplay=false


ActionForm value= .
.

<html:submit value=""/>

<input type=submit> .

<html:reset value="" />

<input type=reset> .
HTML FORM <HTML:>
.


ActionForm validate() ActionErrors Action saveMessages()
JSP .
. ActionErrors ActionError ActionMessages
ActionMessage.
.
ActionErrors ActionError(deprecated ) .
ActionMessages ActionMessage .

ActionMessages .

ActionMessage *.properties
.

ActionErrors ActionError .
ActionForm validate() ActionErrors .
.
ActionError deprecated ActionErrors deprecated (
deprecated ). ActionForm.validate() ActionErrors
ActionMessage , Action
ActionMessages ActionMessage .
ActionForm.validate() Action .
*.properties . properties
struts-config.xml .
<message-resources parameter="strutsguide.resources.application" />

.properties .
/WEB-INF/classes/strutsguide/resources/application.properties
.
ActionErrors ActionMessages (ActionForm.validate()
ActionErrors ).
ActionMessages messages = new ActionMessages();

ActionMessage messages .
messages.add("invalidUsernameError",
new ActionMessage("error.invalidUsername", " ."));

invalidUsernameError . JSP

26

.
ActionMessage .
ActionMessage application.properties . ActionMessage
( . {0}) . {0}
. , . .
.
{0} 4 . {0}, {1}, {2}, {3}
.
ActionMessage 4 .
ActionForm.validate() return messages , Action
saveMessages(messages) JSP
.
JSP .
<html:messages id="msg" property="invalidUsernameError">
<%-invalidUsernameError ActionMessage
.
--%>
<b><bean:write name="msg"/></b>
</html:messages>

<html:messages> property= add .


msg id=msg .
msg <bean:write name=msg/> .
,
.
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(error.invalidLogin"));

ActionMessages.GLOBAL_MESSAGE .. ActionMessages ActionErrors


ActionErrors.GLOBAL_ERROR .

<html:messages id="msg" message="true">
<%-ActionMessages.GLOBAL_MESSAGE ActionMessage
.
--%>
<b><bean:write name="msg"/></b> <br />
</html:messages>

. message=true ActionErrors ActionMessages .


ActionErrors message=false .
, <html:messages> id=msg msg
<b><bean:write name="msg"/></b> <br /> .
*.properties ,
(i18n; ).

27

5.
<bean:write>
Action Action request[session,application].setAttribute()
JSP .

<bean:write name=attribute property=/> .

<bean:write> property name .

property=email name .getEmail()


.

<bean:write name=userInfo property=address.postcode/> , userInfo.getAddress


().getPostcode() .

<bean:write> HTML (&, <, > ) &amp;, &lt; .


<bean:write filter=false/> filter
false .

<html:rewrite>
<html:rewrite> HTML .
HTML <img src=/image/button.gif> .
/ /strutsexample
src URL . URL
/strutsexample/image/button.gif .
.
<html:rewrite page=/> . ,
/image/button.gif strutsexample
/strutsexample/image/button.gif .
<img src=<html:rewrite page=/image/button.gif/>> . src
. <html:rewrite page=>
. .
form action img src /
.
.

28

6. RequestProcessor
MVC Controller .
Controller
.
Controller RequestProcessor
.
RequestProcessor .
RequestProcessor request response
, Action .
RequestProcessor
,

processPreprocess : . Action request response


.

processRoles : Action , Action


.
.

RequestProcessor
struts-config.xml .
<controller processorClass="strutsguide.controller.NewRequestProcessor"/>

processorClass RequestProcessor .
<controller> <action-mapping> . .
struts-blank.war struts-config.xml .

processRoles()

protected boolean processRoles(


HttpServletRequest request,
HttpServletResponse response,
ActionMapping mapping) throws IOException, ServletException {
// Action Role .
String roles[] = mapping.getRoleNames();
// request session
// roles[] .
// Action Role
return true;
//
return false;

Action Role struts-config action .

<action-mappings>
<action
roles="admin,manager"

29

....
/>
</action-mappings>

processPreprocess
.
JSP
request.setCharacterEncoding(); .

NewRequestProcessor

package strutsguide.controller;
import java.io.UnsupportedEncodingException;
import org.apache.struts.action.RequestProcessor;
import javax.servlet.http.*;
/**
* RequestProcessor .
*/
public class NewRequestProcessor extends RequestProcessor {
/**
* Action request response .
*/
protected boolean processPreprocess(HttpServletRequest request,
HttpServletResponse response) {
try {
// HTTP .
request.setCharacterEncoding("euc-kr");
} catch (UnsupportedEncodingException e) {
// do nothing;
}

return true;

JSP request.setCharacterEncoding(euc-kr)
.
request response processPreprocess()
.
Validator .
, Tiles , Tiles RequestProcessor
org.apache.struts.tiles.TilesRequestProcessor .

30

7. Tiles
Tiles ?

Tiles ,
.

<jsp:include> <%@include%> Tiles .

JSP Include JSP include


. include
.

Tiles ,
. .

Tiles

Tiles . (Layout) Tiles Definition.

: HTML
JSP .

Tiles Definition : HTML JSP


. XML JSP , XML .

Tiles

struts-config.xml Tiles Plugin .

<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/config/tiles-defs.xml"/>
<set-property property="definitions-debug" value="2"/>
<set-property property="definitions-parser-details" value="2"/>
<set-property property="definitions-parser-validate" value="true"/>
</plug-in>

<set-property property="definitions-config" value="/WEB-INF/config/tiles-defs.xml"/> Tiles


Definition . .

Layout

Layout JSP .

"/tiles/classicLayout.jsp" .

<%@page contentType="text/html; charset=euc-kr"%>


<%@taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%>
<!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=euc-kr">
<title><tiles:getAsString name="title" /></title>
</head>
<body>
<h1><tiles:getAsString name="title"/></h1>
<table border="1" width="100%">
<tr>
<td colspan="2"><tiles:insert attribute="header"/></td>
</tr>
<tr>

31

<td width="140"><tiles:insert attribute="menu"/></td>


<td><tiles:insert attribute="body"/></td>
</tr>
<tr>
<td colspan="2"><tiles:insert attribute="footer"/></td>
</tr>
</table>
</body>
</html>

<%@taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%> Tiles


.

<tiles:insert attribute="footer"/> Tiles Definition(tilesdefs.xml) "footer" JSP HTML .

<tiles:getAsString name="title"/> Tiles Definition "title"


.

JSP ( /tiles/classicLayout.jsp).

Tiles Definition :

, , , . , ,
. JSP Include , , Include
. , Tiles .

Definition "/WEB-INF/config/tiles-defs.xml" .

<?xml version="1.0" encoding="euc-kr" ?>


<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name=".layout-main" path="/tiles/classicLayout.jsp">
<put name="title" value=" ~"/> <!-- <tile:getAsString>
-->
<put name="header" value="/tiles/header.jsp"/>
<put name="menu" value="/tiles/menu.jsp"/>
<put name="body" value="/tiles/body.jsp"/>
<put name="footer" value="/tiles/footer.jsp"/>
</definition>
<definition name=".layout-menu1" extends=".layout-main">
<put name="body" value="body-menu1.jsp"/>
</definition>
<definition name=".layout-menu2" extends=".layout-main">
<put name="body" value="body-menu2.jsp"/>
</definition>
</tiles-definitions>
<definition> : . definition

<definition name=/> : definition . .


(.) .

<definition path=/> : definition JSP HTML JSP


.

<put> : JSP HTML .

<put name=/> : .

<put value=/> : JSP, HTML .

32

definition

Tiles definition definition


() definition , definition
.

<definition extends=definition name/> . "body"


JSP .

definition definition .

Tiles

, .

struts-config.xml Action Forward .

<?xml version="1.0" encoding="UTF-8" ?>


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<action
path="/tiles/main"
forward=".layout-main"/>
<action
path="/tiles/menu1"
forward=".layout-menu1"/>
<action
path="/tiles/menu2"
forward=".layout-menu2"/>
</action-mappings>
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/config/tiles-defs.xml"/>
<set-property property="definitions-debug" value="2"/>
<set-property property="definitions-parser-details" value="2"/>
<set-property property="definitions-parser-validate" value="true"/>
</plug-in>
</struts-config>

Tiles Definition <action forward=""> forward , <forward path="">


path .

<action forward=""> .

definition forward .

JSP . header.jsp, footer.jsp, menu.jsp


definition , body JSP .

header.jsp

<%@page contentType="text/html; charset=euc-kr"%>


<h2 align="center">Struts Tiles .~</h2>
footer.jsp
<%@page contentType="text/html; charset=euc-kr"%>
<div align="center" style="background: yellow;"> </div>
menu.jsp
<%@page contentType="text/html; charset=euc-kr"%>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>

33

<ul>
<li><html:link action="/tiles/main" ></html:link>
<li><html:link action="/tiles/menu1"> 1</html:link>
<li><html:link action="/tiles/menu2"> 2</html:link>
</ul>
body.jsp
<%@page contentType="text/html; charset=euc-kr"%>
<b> ~</b>
body-menu1.jsp
<%@page contentType="text/html; charset=euc-kr"%>
<br />
<br />
1~
body-menu2.jsp
<%@page contentType="text/html; charset=euc-kr"%>
<br />
<br />
2~

(/tiles/main.do)

1 (/tiles/menu1.do)

2 (/tiles/menu2.do)

34

35

8. Validator
ActionForm validate() ,
ActionForm validate()
, validate()
.
Validator() Framework . Validator XML
ActionForm . ActionForm validate()
.
Validator .

valdator-rules.xml : . xxxxxx-1xxxxxx xxxxxx2xxxxxx 6 1 2 7


. ActionForm .

validation.xml : ActionForm validator-rules.xml


. UserInfoForm juminbunho validator-rules.xml
juminbunho . .

validator-rules.xml
<validator> .
.
<validator name= msg=/> name msg .

name : . validation.xml
.

msg : struts-config.xml .properties


. ActionForm.validate() ActionErrors Validator
ActionMessages .

Validation validator-rules.xml
. . (required, minlength, maxlength, ....)

, validator-rules.xml . .
# Struts Validator Error Messages
errors.required={0}() .
errors.minlength={0}() {1} .
errors.maxlength={0}() {1} .
errors.invalid={0}() .
errors.byte={0}() byte .
errors.short={0}() short .
errors.integer={0}() integer .
errors.long={0}() long .
errors.float={0}() float .
errors.double={0}() double .
errors.date={0}() .
errors.range={0}() {1} {2} .
errors.creditcard={0}() .
errors.email={0}() .

native2ascii .
1.2.7 struts-blank.war WEB-INF validatorrule.xml /WEB-INF/config/ . . required, minlength, ..
.

36

validation.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<global>

<!-- 123-456 -->


<constant>
<constant-name>postalCode</constant-name>
<constant-value>^\d{3}-\d{3}$</constant-value>
</constant>

</global>
<formset>
<!-- userInfoForm -->
<form name="userInfoForm">
<!-- userInfoForm name() -->
<field property="name" depends="required">
<!-- arg {0}, {1}, .. . -->
<arg key="userInfoForm.username" />
</field>
<!-- userInfoForm address() -->
<field property="address" depends="required">
<arg key="userInfoForm.address" />
</field>
<!-- userInfoForm postcode() -->
<field property="postcode" depends="required,mask">
<!-- mask -->
<msg name="mask" key="userInfoForm.postcodeError"/>
<arg key="userInfoForm.postcode" />
<var>
<var-name>mask</var-name>
<var-value>${postalCode}</var-value> <!-- -->
</var>
</field>

</form>
</formset>

<field property="email" depends="required,email">


<!-- email rule key
. -->
<arg key="userInfoForm.email" />
</field>

</form-validation>

validation.xml . /WEB-INF/config
.

<global><constant/></global> constant
. postalCode .
<form> ${postalCode} .

ActionForm <formset><form>..</form></formset>
.

name : struts-config.xml ActionForm .

37

<form><field>...</field></form> .

property : .

depends : validator-rules.xml .
. .
.

<msg> : validator-rules.xml

name : . depends
.

key : .

<arg> : {0}, {1}, ..


.

key :

<msg> <arg> resource : resource false


key .

<var> : .
, mask . mask
(regular expression) .

<var-name> :

<var-value> :

validation.xml .
application.properties .
error.invalidUsername= . {0}
error.invalidPassword= .
error.invalidLogin= .
# /
message.header=<ul>
message.footer=</ul>
# Struts Validator Error Messages
errors.required={0}() .
errors.minlength={0}() {1} .
errors.maxlength={0}() {1} .
errors.invalid={0}() .
errors.byte={0}() byte .
errors.short={0}() short .
errors.integer={0}() integer .
errors.long={0}() long .
errors.float={0}() float .
errors.double={0}() double .
errors.date={0}() .
errors.range={0}() {1} {2} .
errors.creditcard={0}() .
errors.email={0}() .
# messages for Validation
userInfoForm.username=
userInfoForm.address=
userInfoForm.postcode=
userInfoForm.postcodeError={0} . \
123-456 .
userInfoForm.email=

38

struts-config.xml
Validator struts-config.xml .
. <form-bean> <form-beans>, <action> <action-mapping>
, <plug-in> <action-mappings> <message-resources> plug-in
.
<!-- Validator -->
<form-bean
name="userInfoForm"
type="strutsguide.forms.UserInfoForm">
</form-bean>
<!-- Validator / -->
<action path="/validator/inputUserInfo" forward="/validator/inputUserInfo.jsp"/>
<!-- Validator request
userInfo.jsp -->
<action
path="/validator/addUserInfo"
type="strutsguide.actions.AddUserInfoAction"
name="userInfoForm"
scope="request"
validate="true"
input="/validator/inputUserInfo.jsp"
>
<forward name="success" path="/validator/viewUserInfo.jsp"/>
</action>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/config/validator-rules.xml,/WEB-INF/config/validation.xml"/>
</plug-in>

Validator ValidatorPlugIn . <plugin>. <set-property> validator-rules.xml validation.xml


.
/validator/inputUserInfo.do UserInfoForm ,
Validator /validator/adduserInfo.do
/validator/viewUserInfo.jsp .
validate() Validator
.

UserInfoForm
Validator ActionForm ValidatorForm
.
validator() . Validator
.
package strutsguide.forms;
import org.apache.struts.validator.ValidatorForm;
/**
* Validator
*/

39

public class UserInfoForm extends ValidatorForm {


/** */
private String name = null;
/** */
private String address = null;
/** */
private String postcode = null;
/** */
private String email = null;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
}

// validate() .

required 123-456 3-3


(^\d{3}-\d{3}$) mask . mask
.
email . (validation.xml )

/validator/inputUserInfo.jsp
JSP , . Validator

.
<%@ page contentType="text/html; charset=euc-kr"%>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>

40

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"


"http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Validator - </title>
<html:base/>
</head>
<body>
<h3> .</h3>
<!-- -->
<html:messages id="msg" header="message.header" footer="message.footer">
<li><b><bean:write name="msg" /></b></li>
</html:messages>

</body>
</html:html>

<html:form action="/validator/addUserInfo" method="POST" focus="name">


: <html:text size="20" property="name" /><br />
: <html:text size="80" property="address"/><br />
: <html:text size="7" property="postcode" maxlength="7" /><br />
: <html:text size="20" property="email"/><br />
<html:submit value=""/> &nbsp; <html:reset value=""/>
</html:form>

header footer ,
. <ul> </ul> .

AddUserInfoAction
package strutsguide.actions;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import strutsguide.forms.UserInfoForm;
/**
* Validator .
* request .
*/
public class AddUserInfoAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
UserInfoForm uiform = (UserInfoForm)form;
// ValidateActionForm
String name = uiform.getName();
String address = uiform.getAddress();
String postcode = uiform.getPostcode();
String email = uiform.getEmail();

41

// request .
request.setAttribute("name", name);
request.setAttribute("address", address);
request.setAttribute("postcode", postcode);
request.setAttribute("email", email);
}

return (mapping.findForward("success"));

Validator .
Action request Attribute
. viewUserInfo.jsp .

/validator/viewUserInfo.jsp
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Validator - </title>
<html:base/>
</head>
<body>
<h3> </h3>
<ul>

</body>
</html:html>

</ul>

<li><b></b> : <bean:write name="name"/></li>


<li><b></b> : <bean:write name="address" /></li>
<li><b></b> : <bean:write name="postcode"/></li>
<li><b></b> : <bean:write name="email"/></li>

request Attribute <bean:write> .


~!

/validator/inputUserInfo.do .

42

.
.

, (?). JSP Action


request.setCharacterEncoding(euc-kr) .
RequestProcessor
Controller . ( TilesProcessor . .)
.

43

111-222 @ # .
.
required mask
email .
validation.xml <msg> mask
.

addUserInfo.do /validator/viewUserInfo.jsp
.

44

9. (Exception Handling)

Action
.

Action <action> <exception> ,


<gloabal-exceptions> .

<exception>
<exception
type="org.apache.struts.webapp.example.ExpiredPasswordException"
key="expired.password"
path="/changePassword.jsp"
handler="ExceptionHandlerClass" />
type : .

key :

hander : . ExceptionHandler ,
path .

path : JSP .

path

path , key
.

handler path hander=org.apache.struts.action.ExceptionHandler


, ExceptionHandler path JSP
.

path ActionMapping input


.

ExceptionHandler JSP org.apache.struts.Globals.EXCEPTION_KEY


request Exception . key
ActionMessage JSP . JSP Exception
.


struts-config.xml Exception .
Exception Action
.
/exception/throwException.do .
<global-exceptions>
<!-- Action -->
<exception
type="java.lang.Exception"
key="exception.all"
path="/exception/exception.jsp"
/>
</global-exceptions>
<!-- . -->
<action
path="/exception/throwException"
type="strutsguide.actions.ThrowExceptionAction" />

45

ThrowExceptionAction
Exception, NullPointerException, IOException
.
package strutsguide.actions;
import java.io.IOException;
import org.apache.struts.action.Action;
import org.apache.struts.action.*;
import javax.servlet.http.*;
/**
* global exception .
*/
public class ThrowExceptionAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
long currentTime = System.currentTimeMillis();
int exType = (int)(currentTime % 3);
if (exType == 0) {
throw new Exception(" Exception .");
} else if (exType == 1) {
throw new NullPointerException("NullPointerException .");
} else if (exType == 2) {
throw new IOException("IOException .");
}

// .
return null;

/exception/exception.jsp
<exception path="/exception/exception.jsp"/>
JSP .
,
. .

<%@ page contentType="text/html; charset=euc-kr"%>


<%@ page import="org.apache.struts.Globals" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> </title>
</head>
<body>
<h2> </h2>
<html:messages id="error" header="message.header" footer="message.footer">
<li><bean:write name="error"/></li>

46

</html:messages>
<br />
<h2>Exception </h2>
<blockquote style="background: wheat;">
<%
Exception ex = (Exception)request.getAttribute(Globals.EXCEPTION_KEY);
if (ex == null) {
out.println("ex == null");
} else {
out.println(ex.getMessage());
}
%>
</blockquote>
</body>
</html>

<html:messages> <exception key=""/> key .


Globals.EXCEPTION_KEY request
.

application.properties
application.properties .
# for exception handler
exception.all= .
exception.sghandler={0} : . : {1}

struts-config.xml <global-exceptions> (,
) /exception/throwException.do .

47

( Tomcat)
.

.

<globa-exceptions> .


ExceptionHandler execute() . execute()
Action ActionForward .
public ActionForward execute(
Exception ex,
ExceptionConfig ae,
ActionMapping mapping,
ActionForm formInstance,
HttpServletRequest request,
HttpServletResponse response) throws ServletException {
//....
}

return ;


<global-exceptions> , <action> .
<action> .
.
IOException NullPointerException .
.
/exception/throwException.do .
<!-- . -->
<!--
<action
path="/exception/throwException"
type="strutsguide.actions.ThrowExceptionAction" />
-->
<action
path="/exception/throwException"
type="strutsguide.actions.ThrowExceptionAction" >

48

<!-- NullPointerException IOException -->


<exception
key="exception.sghandler"
handler="strutsguide.exhandlers.SGExceptionHandler"
path="/exception/exception.jsp"
type="java.lang.NullPointerException"/>
<exception
key="exception.sghandler"
handler="strutsguide.exhandlers.SGExceptionHandler"
path="/exception/exception.jsp"
type="java.io.IOException"/>
</action>

SGExceptionHandler
ExceptionHandler SGExceptionHandler .
package strutsguide.exhandlers;
import java.util.Date;
import org.apache.struts.action.*;
import org.apache.struts.config.ExceptionConfig;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.commons.logging.*;
/**
* ExceptionHandler .
* Action try/catch throw
* struts-config.xml &lt;exception&gt;
* .
*/
public class SGExceptionHandler extends ExceptionHandler {
Log log = LogFactory.getLog(SGExceptionHandler.class);
/**
* Action &lt;exception&gt; .
*/
public ActionForward execute(Exception ex,
ExceptionConfig config,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws ServletException {
// .
String [] args = new String[2];
long currentTimeMillis = System.currentTimeMillis();
Date currentTime = new Date(currentTimeMillis);
// .
args[0] = currentTime.toString();
// .
args[1] = ex.getMessage();
// {0}, {1}

49

// .
ActionMessage errorMessage = new ActionMessage(config.getKey(), args);
// .
System.err.println(errorMessage.toString());
ex.printStackTrace();
// JSP . <exception path=""/>
ActionForward forward = new ActionForward(config.getPath());
// request .
storeException(request, config.getKey(), errorMessage, forward, config.getScope());

// ~!
return forward;

SGExceptionHandler <exception key="exception.sghandler"/>


ex.getMessage() ActionMessage .
config.getPath() <exception path="/exception/exception.jsp"/>
JSP ActionForward .
storeException() (config.getScope())
.
IOException NullPointerException .

, Exception <global-exceptions>
.
JSP ,
.
Logger , "
." . .
JSP (ex == null),
JSP .
.

50

10. (Logging)
System.out.println()
,
.
. !

System.out.println() !!!
,
.
,
, , ,

, , .
Jakarta Commons-Logging . Commons-Logging
. .
Commons-Logging .
Commons Logging Log4j .

Commons-Logging
Commons-Logging .
.
Commons-Logging .
http://jakarta.apache.org/commons/logging .

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import ..;
public class SomeAction extends Action {
// . .class .
private static Log log = LogFactory.getLog(SomeAction.class);
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
// ...
if (log.isDebugEnabled()) {
// Debug if (log.isDebugEnabled()) !
log.debug( ...);
}
//
log.info( );

try {
//
} catch (Exception ex) {
// . Exception Stack Trace .
log.error( ~~!!, ex);
}
// ..

51

log.debug() : . debug() .
if (log.isDebugEnabled()) { } debug
.

log.info() : . . .

log.error(), log.fatal() : . Exception


Exception StackTrace .

Commons-Logging .

Log4j
Commons-Logging . http://logging.apache.org/log4j/docs/index.html
Log4j log4j-version.jar /WEB-INF/lib Commons-Logging Log4j
Log4j .
Log4j , /WEB-INF/classes
log4j.properties .
# DEBUG, INFO .
log4j.rootLogger = DEBUG, stdout, dailyfile
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
# .
log4j.appender.dailyfile.File = struts.log
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n

DEBUG DEBUG INFO


.

log4j.appender.stdout.layout.ConversionPattern=%5p (%F[%M]:%L) [%d] - %m%n


. ~

Log4j log4j.properties
, , Socket
(http://traxel.com/lumbermill/) .
.

52

11.ActionForm
HTML request.getParameter("name");
, ActionForm Struts/Action
.

ActionForm?

HTML ("<input type='text' name='phone'/>" ) ActionForm


, () ()
Action .

: ActionForm ( - )
! - . ActionForm
.

ActionForm

ActionForm "org.apache.struts.action.ActionForm" .

Action validate() .

"reset()" . ActionForm .

ActionForm String boolean .


.

HTML (
) . .

ActionForm ,
.

ActionForm struts-config.xml .

<form-beans>
<form-bean
name="menuForm"
type="myproject.form.MenuForm"/>
</form-beans>
name : . Action .

type : ActionForm .

DynaActionForm (Struts 1.1 )

DynaActionForm Jakarta Commons DynaBean Map


.

type=org.apache.struts.action.DynaActionForm strutsconfig.xml ActionForm .

reset() .

validate() DynaActionForm . validate()


Validator Framework .

ActionForm .

DynaActionForm .

<form-bean
name="myForm"
type="org.apache.struts.action.DynaActionForm">

53

<form-property name="name" type="java.lang.String"/>


<form-property name="address" type="java.lang.String"/>
</form-bean>

<form-property> .

ActionForm
<html:text property="values.telephoneText" size="14" maxlength="14"/>

"." . aForm ActionForm "aForm.getValues().


getTelephoneText()" .

Map ActionForm (Struts 1.1 )


ActionForm getter setter . Map
.

ActionForm Map
. ~

public void setValue(String key, Object value)

public Object getValue(String key);

JSP . value(key) .

<html:text property="value(key)"/> <!-- -->


<bean:write name="formBean" property="value(key)"/> <!-- -->

ActionForm

Jakarta Commons BeanUtils


(http://jakarta.apache.org/commons/beanutils/, Struts )
.

ActionForm ( ),
. actionFormBean get
modelBean set .

BeanUtils.copyProperties(modelBean, actionFormBean);
(: actionFormBean "String getAge()", modelBean "void

setAge(int)" ) BeanUtils . ,
.

int value = Integer.parseInt(actionFormBean.getAge());


modelBean.setAge(value);
.

54

12.ActionForward
ActionForward?

Action (JSP Action ..)


ActionForward.

-> ActionServlet -> [ActionForm] -> Action -> ActionForward path


(HTML,JSP,Action ...)

ActionForward

ActionForward (path) .

Path GET .
<forward name="logoff" path="/Logoff.do"/>
<forward name="logon" path="/logon.jsp" redirect="true"/>

"redirect=true" Forward Redirect.

forward : request . .
.

redirect : HTTP . request .


.

: Action .

<global-forwards>
<forward name="logon" path="/logon.do" redirect="true"/>
</global-forwards>
: ActionMapping , Action .
<action-mappings>
<action path="/welcome"
type="app.ContinueAction">
<forward name="continue" path="/pages/Welcome.jsp"/>
</acton>
</action-mappings>

ActionForward

Action ActionForward . forward name "continue" .


ActionForward forward = mapping.findForward("continue");
return forward; // Action .

GET

<html:link> URL ,
<html:link forward="article" paramId="key" paramProperty="key" name="articleForm" useLocalEncoding="true">
<bean:write name="articleForm" property="name"/>
</html:link>
<!-- HTML . -->
<a href="http://localhost/artimus/do/article?key=17">News from the edge</a>

"key" .

55

useLocalEncoding URL . false


UTF-8 .( Struts 1.2 .)

GET URL .
.

Action

ActionForward forward = mapping.findForward("article");


StringBuffer path = new StringBuffer(forward.getPath()); // struts-config.xml forward (path) .
boolean isQuery = (path.indexOf("?") >= 0); // ?
if (isQuery) {
path.append("&dispatch=view"); // URL Encoding !
} else {
path.append("?dispatch=view"); // URL Encoding !
}
// path "/do/article?dispatch=view" .
return new ActionForward(path.toString()); // Action .

<forward> , URL .
ActionForward forward = new ActionForward("/do/itemEdit?action=Edit");

56

13.ActionMapping
ActionMapping?

URL Action .

URL struts-config.xml ActionForm


, ActionForm , Action .

ActionMapping Struts .

<action-mappings>
<!-- http://hostname/logoff.do app.LogoffAction
.-->
<action path="/logoff" type="app.LogoffAction"/>
<!-- http://host/logonSubmit.do ,
"logonForm" ActionForm
.
ActionForm validate() false "/pages/Logon.jsp"
. -->
<action
path="/logonSubmit"
type="app.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="/pages/Logon.jsp"/>
<action
path="/logon"
type="app.ContinueAction">
<forward name="continue" path="/pages/Logon.jsp"/>
</action>
</action-mappings>

<action>

path : URI. ActionServlet *.do , path ".do"


.

) path="login" -> URL http://host/login.do .

forward () : Action forward. (RequestDispatcher.forward )

include : Action include.

type : . Action .

name : ActionForm . <form-bean> (name) .

roles : . . RequestProcessor "processRoles"


.

scope : ActionForm .( request, session)

validate : ActionForm validate() . true/false

input : ActionForm validate() false input .

inputForward : input , <forward> . <controller


inputForward="true"/>

unknown : <action> ActionMapping URL(/*.do)


.

57

<action name="/debug"
unknown="true"
forward="/pages/debug.jsp"/>
<forward> () : ActionMapping ActionForward .

<exception> () : ActionMapping ExceptionHandler .

58

14.Action
Action?

Java Web Application , .

Action ActionServlet (request ) (response )


Java Class.

Exception

Control Action Forward .

ActionServlet Action execute(strute 1.1) perform(struts 1.0) Action


.

execute

mapping : Action ActionMapping

form : ActionForm

request :

response :

Action

request parameter : ActionForm , request


, .

: . : Action
. Action .
Action .

Action .

ActionErrors ActionError saveErrors() .

ActonErrors errors = new ActionErrors(); // ActionErrors .


//
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.detail", e.getMessage());
//...
if (!errors.empty()) { //
saveErrors(request, errors);
return (mapping.findForward("error")); //
}

error.detail = {0} , e.getMessage() {0} . 4


.

JSP (mapping.findForward("error") )

<logic:messagesPresent>
<UL>
<html:messages id="error">
<LI><bean:write name="error"/></LI>
</html:messages>
</UL>
</logic:messagesPresent>

59

ActionErrors saveErrors() , ActionMessages


saveMessages() .

JSP <logic:messagesPresent message="true"> .

ActionErrors.GLOBAL_ERROR errors.add("usernameError", new ActionError


("error.username.required"); JSP
<html:errors property="usernameError"/> .

Struts 1.2 ActionErrors ActionError ActionMessages


ActionMessage .

Exception

Action.execute() ExceptionHandler JSP .

ActionForward null

ActionForward null response .


.

. Action reponse
ActionForward null .

Action

ForwardAction

<action
path="/saveSubscription"
type="org.apache.struts.actions.ForwardAction"
name="subscriptionForm"
parameter="//" />

Action Form Bean ,


.

DispatchAction

Action DispatchAction
.

DispatchAction Action .

Dispatch perform() execute() , perform()


execute() .

DispatchAction .
.

<!-- DispatchAction Action recordDispatchAction -->


<action
path="/dataRecord"
type="app.recordDispatchAction"
name="dataForm"
scope="request"
input="/data.jsp"
parameter="method"/> <!-- parameter -->
Action "http://localhost/app/dataRecord.do?method=delete" ,

method delete recordDispatchAction public ActionForward delete(...)


.

60

Action

. Action .
, Action .

Action ,
. Action
. - , Action
.

Action , Action
. Action !

Action .

Action .

61

15.PlugIn
ActionServlet init() ,
ActionServlet (, ) destroy() Action.
Servlet init(),destroy() .
org.apache.struts.action.PlugIn Action .
struts-config.xml .
<plug-in className="myApp.MyAction">
<set-property property="key" value=""/>
</plug-in>

className Action PlugIn , init() destroy()


.

62

16. ?
.
.
.
.

..
.

DynaActionForm ActionForm ActionForm .

: .

: struts-config.xml . .

JSTL : bean logic JSP . bean logic


JSTL .

XDoclet (http://xdoclet.sf.net) : struts-config.xml ActionForm, Action


. XDoclet
struts-config.xml .
.

:
. .



, Oreilly Struts Cookbook, http://www.sourcebeat.com Struts Live . Struts Live
( ) PDF
(http://www.theserverside.com/books/sourcebeat/JakartaStrutsLive/index.tss) .

.
Struts in Action .
, . ,
.
.

http://www.okjsp.pe.kr , , Struts .

http://www.javajigi.net .

http://www.openseed.net : Java Open Source ..

JSP/Servlet JDBC :
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968185187&k=JDBC
&d=tb#968185187

: http://youngrok.com/wiki/wiki.php/%C0%DA%B9%D9%C0%A5%C7%
C1%B7%CE%B1%D7%B7%A1%B8%D3%C0%C7%B1%E2%BA%BB

J2EE ( ?) :
http://www.j2eestudy.co.kr/lecture/lecture_read.jsp?table=j2ee&db=lecture0201_1&id=24

63

You might also like