[13] Struts1 기본문법
----------------------------------------------------[스트럿츠 기본]
1. 스트럿츠
- JSP모델2 MVC구조로 개발할 수 있는 기반을 제공하는 프레임 워크이다
- XML기반의 Controller역할을 담당한다
2. 스트럿츠로 구현하는 MVC
1) Model : 상태정보를 가지고 있는 자바빈즈(DTO)와
상태에 변화를 줄 수 있는 로직을 담고 있는 자바빈즈(DAO)가 수행한다
2) View : 뷰 역할은 JSP를 사용한다.
스트럿츠에서는 스트럿츠의 다른 컴포넌트들과 쉽고 편리하게 결합될 수 있는
태그라이브러리를 제공하는데 이를 이용하면 JSP코드가 가독성이 높아지고 소스가 간단해 진다
3) Controller : 컨트롤러 역할은 ActionServlet과 Action클래스에서 호출하는 클래스가 이에 해당한다
요청 컨트롤러 서블릿을 따로 만들 필요가 없고 ActionServlet이 그 역할을 해주고 있으며
ActionServlet에서 실제 로직을 수행하는 액션 클래스를 실행한다
컨트롤러의 역할 가운데 하나인 리소스(주로 jsp)포워드는 어떻게 하느냐?
스트럿츠 설정파일 struts-config.xml파일에서 지정한 액션 매핑을 이용한다.
3. 스트럿츠의 단점
- 기능이 너무 다양해서 설정파일의 복잡도가 높다
-----------------------------------------------------스트럿츠 다운
http://struts.apache.org/downloads.html
Struts 1.3.10 -> struts-1.3.10-all.zip 다운 및 압축풀기
이클립스에서 struts1 라이브러리 추가 순서
프로젝트 미리 생성하지 말고 war파일 설치함과 동시에 프로젝트 생성할 것
(.war 대부분 샘플용으로 압축해서 배포됨)
New -> import -> Web -> WAR ->
D:\jsp2_week\setup\struts-1.3.10-all\struts-1.3.10\apps\struts-blank-1.3.10.war
프로젝트명 : struts1Test
-----------------------------------------------/WEB-INF/web.xml
<web-app>
<display-name>Struts Blank Application</display-name>
<!-- Standard Action Servlet Configuration -->
<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/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
-----------------------------------------------/WEB-INF/struts-config.xml
<action-mappings>
<action
path="/HelloAction"
type="test.HelloAction"
forward="/hello.jsp">
<forward name="tohello" path="/hello.jsp"/>
</action-mappings>
action은 *.do로 시작하므로 *에 들어가는 값이 path의 HelloAction일때
즉 웹에서 HelloAction.do를 요청하면 struts-config.xml의 action-mapping의 path가
HelloAction인 action이 실행된다
-------------------------------------------------------
struts-config.xml은 항상 다음의 순서로만 작성되어야 한다
<struts-config>
<data-sources/>
<form-beans/>
<global-exceptions/>
<global-forwards/>
<action-mappings>
<controller/>
<message-resources/>
<plug-in/>
</struts-config>
--------------------------------------------------------결과확인
http://localhost:9090/struts1Board/LoginForm.do
--------------------------------------------------------스트럿츠 클래스의 활용
1. action을 사용한 로그인
1) 구현할 파일
struts-config.xml (controller)
LoginAction.java (command)
LoginDTO.java (dto)
LoginDAO.java(connection pool)
LoginForm.jsp
Logon.jsp
Fail.jsp
2) struts-config.xml
<action
path="/LoginForm"
forward="/login/LoginForm.jsp"/>
<action
path="/Login"
type="login.LoginAction"
validate="false"
scope="request">
<forward name="logon" path="/login/Logon.jsp"/>
<forward name="fail" path="/login/Fail.jsp"/>
</action>
path : *.do의 .do를 제외한 '*'
forward : 해당 위치로 이동
Type : 자바클래스를 실행한다
validate : true일 경우 유효성 검사를 하는데 이때 ActionForm클래스 안에 있는
validate메소드가 실행된다(직접코딩)
reset : ActionForm클래스 안의 파라미터를 모두 리셋시킨다
scope : 모델에서 넘어오는 값을 리턴 받아 request, session, application등의 형태를
scope에 저장하여 view페이지를 지정한 뒤 리턴한다.
첫번째 action은 기본 action으로 path에 따라 forward되며
두번째 action은 path에 따라 자바클래스를 돌고 forward된다
-------------------------------------------------[Struts의 주요 클래스]
1. ActionServlet
- servlet.
- 모든 클라이언트의 요청을 제일 먼저 맞이한다.
- 톰캣 구동시 같이 메모리에 로딩
- init() 메소드를 통해 /WEB-INF/struts-config.xml
파일에 있는 내용들을 ServletContext 객체에 저장
2. Action
- 실제적인 비즈니스 로직 처리를 담당한다
- Controller로서 Model 영역과 접점을 가지는 객체.
- 사용자의 HTTP 요청에 반응하는 객체로서, struts-config.xml에 저장된
action element에 따라 객체가 생성됨. 이때 객체는 매번 생성되는 것이
아니라 단 한번 생성되어 재 사용된다.
- 보통 직접 Action 클래스를 사용하지 않고 Action 클래스를 상속받는 클래스를
제작하게 되고 Action 클래스가 가지고 있는 execute() 메소드를 오버라이딩하게 한다.
- 실제 개발자는 Model과의 작업을 위해 execute() 메소드에서
Model쪽 Manager 객체를 생성하고 관련 비즈니스 메소드를 호출하는 작업을 한다.
3. RequestProcessor
- 요청 파라미터 값을 자동으로 ActionForm에 저장한다
- ActionServlet의 분석 결과에 따라 Action을 선택한다
- ActionServlet을 대신하여 Action의 execute() 메소드를 호출하는 역할.
- execute() 메소드 호출 결과인 ActionForward에 따라 View를 연결한다.
예) /login.do를 사용작 요청하면 struts-config에서 /login으로 지정된 action을 찾아 수행한다
4. ActionForward
- Controller의 execute() 호출 결과로서, 페이지 이동에 대한 정보를 객체화 한 것.
- 객체를 통해 forward할 것인지, redirect할 것인지 정해진다.
5. ActionForm
- HTTP 요청에 따라 파라미터를 처리하기 위한 클래스.
- 테이터를 저장하고 전달하는 DTO(Data Transfer Object) 객체.
- ActionForm을 상속받는 형태로 작성.
- ActionForm 객체의 필드는 자동으로 세팅된다.
- reset() 메소드로 필드 초기화
- validate() 메소드로 유효성 검증
- 유효성 여부에 따라 Action 수행 여부가 결정된다
- 보통의 Bean 클래스처럼 필드에 접근처리할 수 있는 setter, getter를 작성하면 된다.
6. ActionMapping
- 사용자 HTTP 접근에 따라 어떠한 Action 객체가 사용되어야 하는지, 그 Action 처리 후
어느 페이지로 이동해야 하는지에 대한 정보가 struts-config.xml에 있다.
이 ActionMapping은 그 중에서 이동할 페이지에 대한 맵핑을 가진 객체이다.
지정된 이름의 forward를 찾아서 ActionForward 객체를 돌려주게 된다.
7. ActionMessages
- 각종 메시지를 처리하는 클래스. (에러 포함)
8. ActionMessage
- 한 개의 메시지 처리.
9. ActionErrors
- 각종 에러 메시지를 처리하는 클래스
- ActionMessages를 상속받고 있음.
10. ActionError
- 한 개의 에러 메시지 처리.
>>>>>>>>>>>>>>>>>> 1. ActionForm을 사용한 로그인 >>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> 작성순서 >>>>>>>>>>>>>>>>>>>>>>>>>
------------------------------------------------------------결과확인
http://localhost:9090/struts1Test/LoginForm.do
--------------------------------------/WebContent/login/LoginForm.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="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>LoginForm.jsp</TITLE>
</HEAD>
<BODY>
<form name="frm" method="post" action="Login.do">
아이디 : <input type="text" name="id" /><br/>
비번 : <input type="password" name="passwd" /><br/>
<input type="submit" value="확인" />
</form>
</BODY>
</HTML>
--------------------------------------/WebContent/login/Logon.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="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>logon.jsp</title>
</head>
<body>
로그인 성공<br/>
<%=request.getParameter("id") %><br/>
<%=request.getParameter("passwd") %><br/>
</body>
</html>
--------------------------------------/WebContent/login/Fail.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="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>Fail.jsp</title>
</head>
<body>
로그인 실패
</body>
</html>
---------------------------------------LoginDAO.java
package login;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class LoginDAO {
private Connection getConnection() throws Exception{
Context initCtx=new InitialContext();
DataSource ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/oracle");
return ds.getConnection();
}
public boolean isLogin(LoginDTO dto){
String id=dto.getId();
String passwd=dto.getPasswd();
if(id.equals("user")&&passwd.equals("1234")){
return true;
}
else{
return false;
}
}
}
---------------------------------------LoginDTO.java
package login;
public class LoginDTO {
private String id;
private String passwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "LoginBean [id=" + id + ", passwd=" + passwd + "]";
}
}
---------------------------------------LoginAction.java
package login;
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;
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("LoginAction");
LoginDTO dto=new LoginDTO();
dto.setId(request.getParameter("id"));
dto.setPasswd(request.getParameter("passwd"));
LoginDAO dao=new LoginDAO();
boolean result=dao.isLogin(dto);
if(result){
return mapping.findForward("logon");
}
else{
return mapping.findForward("fail");
}
}
}
>>>>>>>>>>>>>>>>>> 2. ActionForm을 사용한 로그인 >>>>>>>>>>>
- 장점 : DAO에서 request.getParameter()를 쓰지 않고, ActionForm을 쓴다
- LoginActionForm.java 추가
>>>>>>>>>>>>>>>>>>>>>>>>작성순서>>>>>>>>>>>>>>>>>>>>>
---------------------------------/WebContent/actionform/LoginForm.jsp
---------------------------------/WebContent/actionform/Logon.jsp
---------------------------------/WebContent/actionform/Fail.jsp
파일 3개는 위의 내용과 동일
--------------------------------------------------LoginActionForm.java
package actionform;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class LoginActionForm extends ActionForm {
private String id;
private String passwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
//유효성검사, id와 passwd에 값이 들어있지 않을때 에러발생
@Override
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
System.out.println("validate호출");
if(id==null || id.length()==0){
System.out.println("아이디 입력바람!!");
}
if(passwd==null || passwd.length()==0){
System.out.println("비번 입력바람!!");
}
return null;
}
//세션에 저장되어 있는 LoginActionForm을 초기화 한다
@Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.id=null;
this.passwd=null;
}
}
--------------------------------------------------LoginAction.java
package actionform;
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 login.LoginDAO;
import login.LoginDTO;
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//request.getParameter("id")가 없어지고
//ActionForm이 파라미터 값을 받아 유효성 검사를 한 후에 넘겨준다
//validate가 true일때
LoginActionForm laf=(LoginActionForm)form;
String id=laf.getId();
String passwd=laf.getPasswd();
LoginDTO dto=new LoginDTO();
dto.setId(id);
dto.setPasswd(passwd);
LoginDAO dao=new LoginDAO();
boolean result=dao.isLogin(dto);
if(result){
return mapping.findForward("logon");
}
else{
return mapping.findForward("fail");
}
}
}
---------------------------------------------/WEB-INF/struts-config.xml
ActionForm을 쓸때는 form-bean의 name과 action의 name이 같아야 한다
<struts-config>
<form-beans>
<form-bean
name="ActionForm"
type="actionform.LoginActionForm"/>
</form-beans>
<action-mappings>
<action
path="/LoginActionForm"
forward="/actionform/LoginForm.jsp"/>
<action
name="ActionForm"
path="/ActionForm"
type="actionform.LoginAction"
validate="true"
scope="request">
<forward name="logon" path="/actionform/Logon.jsp"/>
<forward name="fail" path="/actionform/Fail.jsp"/>
</action>
</action-mappings>
</struts-config>
----------------------------------------------------------------결과확인
http://localhost:9090/struts1Test/LoginActionForm.do