Professional Documents
Culture Documents
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 .
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 .
Action : . .
Action Model
.
.
. .
.
.
.
2.
http://struts.apache.org .
WEB-INF/config/struts-config.xml .
WEB-INF/tlds/ *.tld .
WEB-INF/web.xml .
struts-blank.war ,
.
. , config tlds
(
WEB-INF/ .
<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>
<security-constraint> *.jsp .
JSP .
struts-config.xml
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 .
<action> forward=/Welcome.jsp :
Welcome.jsp .
Welcome.jsp .
Action JSP
.
.
Forward Redirect
JSP/Servlet
. Forward Redirect.
.
Action
.
(Model) Action .
Action org.apache.struts.action.Action ,
execute() .
Action
GET/POST ( Action
ActionForm ).
Model Java .
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 .
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"%>
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.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;
}
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
// .
forward = mapping.findForward("success");
// View .
return forward;
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
: ActionForm ( - )
! - . ActionForm
.
ActionForm ..
org.apache.struts.action.ActionForm .
String boolean .
String . ActionForm
int
.
<struts-config>
<form-beans>
<form-bean
name=""
type="myproject.form.FormClass"/>
</form-beans>
</struts-config>
ActionMessages ...
15
WEB-INF/config/struts-config.xml . login1
. . .
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>
17
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();
. /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>
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
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=""> <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/>
<html:text property="username"/>
25
<html:submit value=""/>
<input type=submit> .
<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>
27
5.
<bean:write>
Action Action request[session,application].setAttribute()
JSP .
<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
,
RequestProcessor
struts-config.xml .
<controller processorClass="strutsguide.controller.NewRequestProcessor"/>
processorClass RequestProcessor .
<controller> <action-mapping> . .
struts-blank.war struts-config.xml .
processRoles()
<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 ,
.
Tiles ,
. .
Tiles
: HTML
JSP .
Tiles
<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>
Layout
Layout JSP .
"/tiles/classicLayout.jsp" .
31
JSP ( /tiles/classicLayout.jsp).
Tiles Definition :
, , , . , ,
. JSP Include , , Include
. , Tiles .
Definition "/WEB-INF/config/tiles-defs.xml" .
<put name=/> : .
32
definition
definition definition .
Tiles
, .
<action forward=""> .
definition forward .
header.jsp
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 .
validator-rules.xml
<validator> .
.
<validator name= msg=/> name msg .
name : . validation.xml
.
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>
</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>
</form-validation>
validation.xml . /WEB-INF/config
.
<global><constant/></global> constant
. postalCode .
<form> ${postalCode} .
ActionForm <formset><form>..</form></formset>
.
37
<form><field>...</field></form> .
property : .
depends : validator-rules.xml .
. .
.
<msg> : validator-rules.xml
name : . depends
.
key : .
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>
UserInfoForm
Validator ActionForm ValidatorForm
.
validator() . Validator
.
package strutsguide.forms;
import org.apache.struts.validator.ValidatorForm;
/**
* Validator
*/
39
// validate() .
/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
</body>
</html:html>
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>
/validator/inputUserInfo.do .
42
.
.
43
111-222 @ # .
.
required mask
email .
validation.xml <msg> mask
.
addUserInfo.do /validator/viewUserInfo.jsp
.
44
9. (Exception Handling)
Action
.
<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
.
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 .
,
. .
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>
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
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 <exception>
* .
*/
public class SGExceptionHandler extends ExceptionHandler {
Log log = LogFactory.getLog(SGExceptionHandler.class);
/**
* Action <exception> .
*/
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;
, 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() : . . .
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
Log4j log4j.properties
, , Socket
(http://traxel.com/lumbermill/) .
.
52
11.ActionForm
HTML request.getParameter("name");
, ActionForm Struts/Action
.
ActionForm?
: ActionForm ( - )
! - . ActionForm
.
ActionForm
ActionForm "org.apache.struts.action.ActionForm" .
Action validate() .
"reset()" . ActionForm .
HTML (
) . .
ActionForm ,
.
ActionForm struts-config.xml .
<form-beans>
<form-bean
name="menuForm"
type="myproject.form.MenuForm"/>
</form-beans>
name : . Action .
type : ActionForm .
reset() .
ActionForm .
DynaActionForm .
<form-bean
name="myForm"
type="org.apache.struts.action.DynaActionForm">
53
<form-property> .
ActionForm
<html:text property="values.telephoneText" size="14" maxlength="14"/>
ActionForm Map
. ~
JSP . value(key) .
ActionForm
ActionForm ( ),
. actionFormBean get
modelBean set .
BeanUtils.copyProperties(modelBean, actionFormBean);
(: actionFormBean "String getAge()", modelBean "void
setAge(int)" ) BeanUtils . ,
.
54
12.ActionForward
ActionForward?
ActionForward
ActionForward (path) .
Path GET .
<forward name="logoff" path="/Logoff.do"/>
<forward name="logon" path="/logon.jsp" redirect="true"/>
forward : 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
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
GET URL .
.
Action
<forward> , URL .
ActionForward forward = new ActionForward("/do/itemEdit?action=Edit");
56
13.ActionMapping
ActionMapping?
URL 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>
type : . Action .
57
<action name="/debug"
unknown="true"
forward="/pages/debug.jsp"/>
<forward> () : ActionMapping ActionForward .
58
14.Action
Action?
Exception
execute
form : ActionForm
request :
response :
Action
: . : Action
. Action .
Action .
Action .
JSP (mapping.findForward("error") )
<logic:messagesPresent>
<UL>
<html:messages id="error">
<LI><bean:write name="error"/></LI>
</html:messages>
</UL>
</logic:messagesPresent>
59
Exception
ActionForward null
. Action reponse
ActionForward null .
Action
ForwardAction
<action
path="/saveSubscription"
type="org.apache.struts.actions.ForwardAction"
name="subscriptionForm"
parameter="//" />
DispatchAction
Action DispatchAction
.
DispatchAction Action .
DispatchAction .
.
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>
62
16. ?
.
.
.
.
..
.
: .
: 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 .
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