Spring/Study 2020. 4. 17. 20:17

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

@ModelAttribute

@ModelAttirbute를 이용하면 커멘드 객체의 이름을 변경할 수 있고, 이렇게 변경된 이름은 뷰에서 커멘드 객체를 참조할 때사용된다.

MemberController.java

@RequestMapping(value = "/memRemove", method = RequestMethod.POST)
public String memRemove(@ModelAttribute("mem") Member member) {    
    service.memberRemove(member);    
    return "memRemoveOk";
}
cs

memRemoveOk.jsp

ID : ${mem.memId}<br />
cs

 

커맨드 객체 프로퍼티 데이터 타입

memJoin.html

<form action="/lec19/member/memJoin" method="post">
    ID : <input type="text" name="memId" ><br />
    PW : <input type="password" name="memPw" ><br />
    MAIL : <input type="text" name="memMail" ><br />
    PHONE1 : <input type="text" name="memPhones[0].memPhone1" size="5"> -
             <input type="text" name="memPhones[0].memPhone2" size="5"> -
             <input type="text" name="memPhones[0].memPhone3" size="5"><br />
    PHONE2 : <input type="text" name="memPhones[1].memPhone1" size="5"> -
             <input type="text" name="memPhones[1].memPhone2" size="5"> -
             <input type="text" name="memPhones[1].memPhone3" size="5"><br />
    <input type="submit" value="Join" >
    <input type="reset" value="Cancel" >
</form>
cs

Member.java

public class Member {
    private String memId;
    private String memPw;
    private String memMail;
    private List<MemPhone> memPhones;
    
    public String getMemId() {
        return memId;
    }
    public void setMemId(String memId) {
        this.memId = memId;
    }
    public String getMemPw() {
        return memPw;
    }
    public void setMemPw(String memPw) {
        this.memPw = memPw;
    }
    public String getMemMail() {
        return memMail;
    }
    public void setMemMail(String memMail) {
        this.memMail = memMail;
    }
    public List<MemPhone> getMemPhones() {
        return memPhones;
    }
    public void setMemPhones(List<MemPhone> memPhones) {
        this.memPhones = memPhones;
    }
}
cs

 

Model & ModelAndView

Controller에서 View에 데이터를 전달하기 위해 사용되는 객체로 Model과 ModelAndView가 있다. Model은 뷰에 데이터만을 전달하기 위한 객체이고, ModelAndView는 데이터와 뷰의 이름을 함께 전달하는 객체이다.

@RequestMapping(value = "/memModify", method = RequestMethod.POST)
public String memModify(Model model, Member member) {    
    Member[] members = service.memberModify(member);
        
    model.addAttribute("memBef", members[0]);
    model.addAttribute("memAft", members[1]);
        
    return "memModifyOk";
}
cs

 

@RequestMapping(value = "/memModify", method = RequestMethod.POST)

public ModelAndView memModify(Member member) {        

    Member[] members = service.memberModify(member);

        

    ModelAndView mav = new ModelAndView();

    mav.addObject("memBef", members[0]);

    mav.addObject("memAft", members[1]);

        

    mav.setViewName("memModifyOk");

    

    return mav;

}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 17. 19:54

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

@RequestMapping을 이용한 URL 매핑

@RequestMapping 어노테이션은 http request로 들어오는 URL을 특정 Controller 클래스나 메소드로 연결시켜주는 역할을 한다.

@RequestMapping(value="/memJoin", method=RequestMethod.GET)과 같이 value와 method 속성을 사용할 수 있는데, method의 Default 값은 GET이므로 method를 명시하지 않으면 자동으로 GET 요청을 처리한다.  method 없이 value만 사용할 경우 이름을 생략하여 @RequestMapping("memJoin")과 같이 사용 가능하다.

메소드에 @RequestMapping 적용

public class MemberController {
    @Resource(name="memService")
    MemberService service;
    
    @RequestMapping(value="/member/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

클래스에 @RequestMapping 적용

@RequestMapping("/member")
public class MemberController {
    @Resource(name="memService")
    MemberService service;
    
    @RequestMapping(value="/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

 

요청 파라미터

HttpServletRequest 객체를 이용한 HTTP 전송 정보 얻기

login.html

ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
cs

MemberController.java

@RequestMapping("/member")
public class MemberController {
    @Resource(name="memService")
    MemberService service;
 
    @RequestMapping(value="/memLogin", method=RequestMethod.POST)    
    public String memLogin(Model model, HttpServletRequest request) {
        String memId = request.getParameter("memId");
        String memPw = request.getParameter("memPw");
        
        model.addAttribute("memId", memId);
        model.addAttribute("memPw", memPw);        
        
        return "memLoginOk";
    }
}
cs

 

@RequestParam 어노테이션을 이용한 HTTP 전송 정보 얻기

login.html

ID : <input type="text" name="memId" ><br />
PW : <input type="password" name="memPw" ><br />
cs

MemberController.java

@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, @RequestParam("memId"String memId, @RequestParam("memPw"String memPw) {    
    Member member = service.memberSearch(memId, memPw);
        
    model.addAttribute("memId", member.getMemId());
    model.addAttribute("memPw", member.getMemPw());
                
    return "memLoginOk";
}
cs

 

커멘드 객체를 이용한 HTTP 전송 정보 얻기

memJoin.html

<form action="/lec18/member/memJoin" method="post">
    ID : <input type="text" name="memId" ><br />
    PW : <input type="password" name="memPw" ><br />
    MAIL : <input type="text" name="memMail" ><br />
    PHONE : <input type="text" name="memPhone.memPhone1" size="5"> -
            <input type="text" name="memPhone.memPhone2" size="5"> -
            <input type="text" name="memPhone.memPhone3" size="5"><br />
    AGE : <input type="text" name="memAge" size="4"><br />
            <input type="submit" value="Join" >
            <input type="reset" value="Cancel" >
</form>
cs

Member.java

public class Member {
    private String memId;
    private String memPw;
    private String memMail;
    private MemPhone memPhone;
    
    public String getMemId() {
        return memId;
    }
    public void setMemId(String memId) {
        this.memId = memId;
    }
    public String getMemPw() {
        return memPw;
    }
    public void setMemPw(String memPw) {
        this.memPw = memPw;
    }
    public String getMemMail() {
        return memMail;
    }
    public void setMemMail(String memMail) {
        this.memMail = memMail;
    }
    public MemPhone getMemPhone() {
        return memPhone;
    }
    public void setMemPhone(MemPhone memPhone) {
        this.memPhone = memPhone;
    }
}
cs

MemberController.java

@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Member member) {    
    service.memberRegister(member);        
    return "memJoinOk";
}
cs

memberJoinOk.jsp

 

ID : ${member.memId}<br />

PW : ${member.memPw}<br />

Mail : ${member.memMail} <br />

Phone : ${member.memPhone.memPhone1} - ${member.memPhone.memPhone2} - ${member.memPhone.memPhone3}<br />

 

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 22:13

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

Service 객체 구현

@Service, @Component @Resource, @Repository 어노테이션을 이용하여 Service 객체 생성 및 자동주입이 가능하다. 어노테이션 뒤에 괄호로 이름을 넣어주기도 하는데, 이름을 빼고도 사용할 수 있다.

MemberController.java

@Controller
public class MemberController {
    @Resource(name="memService")
    MemberService service;
}
cs

MemberService.java

//@Service
//@Service("memService")
//@Component
//@Component("memService")
//@Repository
@Repository("memService")
public class MemberService implements IMemberService {
    @Autowired
    MemberDao dao;
}
cs

 

DAO 객체 구현

Service 객체와 마찬가지로 어노테이션을 이용하여 DAO 객체 생성 및 자동주입이 가능하다.

MemberController.java

@Controller
public class MemberController {
   @Resource
    MemberService service;
}
cs

MemberDao.java

@Repository
public class MemberDao implements IMemberDao {
    private HashMap<String, Member> dbMap;
    
    public MemberDao() {
        dbMap = new HashMap<String, Member>();
    }
}

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 22:01

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

스프링(Spring)에서 한글의 깨짐을 방지하기 위해 UTF-8 형식으로 인코딩을 해주어야 한다. 웹 설정파일에서 <filter> 태그를 통해 인코딩이 가능하다.

 

web.xml

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
        
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
cs

 

실행 결과

posted by DevMoomin
:
Spring/Study 2020. 4. 16. 21:16

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

프로젝트 전체 구조

1. java : 웹 애플리케이션에서 사용되는 Controller, Service, DAO 객체들의 java 파일의 위치

2. webapp : 스프링 설정파일, JSP, HTML 등 웹과 관련된 파일의 위치

3. resources : JSP 파일을 제외한 html, css, js 파일 등의 위치

4. spring : 스프링 설정파일의 위치

5. views : JSP 파일의 위치

6. xeb.xml : 웹 설정파일

7. pom.xml : Maven 설정 파일

 

web.xml

웹 애플리케이션에 최초 사용자의 요청이 발생하면 가장 먼저 DispatcherServlet이 사용자의 요청을 받는데, 개발자는 DispatcherServlet을 서블릿으로 등록해주어야 한다. 모든 사용자의 요청을 받기 위해 root를 의미하는 / 로 URL을 매핑한다.

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
cs

 

DispatcherServlet

- HandlerMapping : 적합한 Controller를 선택

- HandlerAdapter : 해당하는 Controller 내에서 가장 적합한 메소드를 선택

- ViewResolver : 가장 적합한 JSP 파일 선택

 

servlet-context.xml

웹 설정파일인 web.xml에 스프링 설정파일의 역할을 하는 파일로 지정되어있다. 클래스로부터 빈(Bean) 객체를 생성하고 조립하는 역할

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>
cs

 

Controller

사용자의 요청을 실체로 처리하는 부분

@Controller
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        
        String formattedDate = dateFormat.format(date);
        
        model.addAttribute("serverTime", formattedDate );
        
        return "home";
    }
}    
cs

 

View

클라이언트 요청정보(URL 매핑 값)에 해당하는 JSP파일 실행

posted by DevMoomin
:
Spring/Solve 2020. 4. 15. 23:52

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

서버 실행 시 아래와 같이 The Specified JRE installation does not exist라는 에러가 발생하는 경우가 있다. 해당 에러는 서버에 JRE 경로가 잘못 지정되어있어서 발생하는 에러이다.

 

1. 상단의 Windows - Preferences 클릭

2. 좌측 트리의 Server - Runtime Environments에서 Tomcat 선택 후 Edit 클릭

3. JRE 버전을 선택하고 Finish 클릭

4. Apply and Close를 클릭하여 설정 적용

posted by DevMoomin
:
Spring/Study 2020. 4. 15. 23:01

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

1. Eclipse 실행 후 Project Explorer 영역에서 마우스 우클릭 - New - Other... 클릭

2. spring을 검색해서 Spring Legacy Project 선택 후 Next 클릭

3. Project name을 입력하고, Spring MVC Project 선택 후 Next 클릭

4. Yes 클릭

5. package name 입력 후 Finish 클릭 (package name은 2단계 이상으로 해야 함)

6. 관련파일 다운로드 등이 완료될 때까지 대기(우측 하단에서 진행사항 확인)

7. 프로젝트 폴더 마우스 우클릭 - Run As - Run On Server를 클릭

8. Finish 클릭

9. 정상적으로 실행되는 것 확인

posted by DevMoomin
:
Spring/Install 2020. 4. 14. 14:56

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

STS(Spring Tool Suite)란 이클립스에서 스프링 기반의 애플리케이션 개발을 지원하는 개발 환경을 의미한다.

STS 설치 전, 웹 컨테이너인 Apache Tomcat이 설치되어 있어야 한다.

 

Apache Tomcat 설치 : https://devmoomini.tistory.com/43

 

1. 이클립스 상단의 Help - Eclipse Marketplace...를 클릭

2. sts를 검색해서 Spring Tools 3 Add-On for Spring Tools 4 3.9.12.RELEASE의 Install을 클릭

3. 모두 체크된 상태에서 Confirm 클릭

4. I accept the terms of the license agreements를 선택하고, Finish 클릭

5. Restart Now를 클릭하여 이클립스를 재실행하면 설치 완료

'Spring > Install' 카테고리의 다른 글

이클립스(Eclipse) Apache Tomcat 설정  (0) 2020.04.20
Apache Tomcat 설치  (0) 2020.04.07
Maven 설치  (0) 2020.04.07
posted by DevMoomin
:
Spring/Study 2020. 4. 14. 11:28

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

Model1

JSP, Service, DAO를 하나의 파일로 처리하는 방식으로, 하나의 파일에서 모든 개발이 이루어지므로 개발 속도가 빠르지만 유지보수가 어렵다.

 

 

Model2

Controller, Service, DAO, View로 각각의 기능을 모듈화 하는 MVC 방식으로, 스프링에서 사용하는 방식이다. 특정 파일만 수정하면 되므로 유지보수가 수월하다.

 

 

스프링 MVC 프레임워크 설계구조

- HandlerMapping : 적합한 Controller를 선택

- HandlerAdapter : 해당하는 Controller 내에서 가장 적합한 메소드를 선택

- ViewResolver : 가장 적합한 JSP 파일 선택

 

DispatcherServlet 설정

JSP 웹 설정파일인 web.xml에 사용자의 모든 요청을 받기 위해 root를 의미하는 / 로 url을 매핑한다. 스프링 설정파일을 설정하면 스프링 컨테이너가 만들어지는데, 스프링 컨테이너에 HandlerMapping, HandlerAdapter, ViewResolver가 자동으로 생성되므로 개발자는 Controller와 View만 작업해주면 된다. (스프링 설정 파일을 설정하지 않으면 자동으로 설정해줌)

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
cs

 

Controller 객체 - @Controller

스프링 설정 파일에 <annotation-driven /> 태그를 넣어주면 스프링 컨테이너를 사용하기 위한 여러 기능을 하는 클래스들이 빈(Bean) 객체로 스프링 설정 파일에 존재하게 된다. 컨트롤러로 사용할 클래스 이름 앞에 @Controller 어노테이션을 명시해준다.

servlet-context.xml

<annotation-driven />
cs

HomeController.java

@Controller
public class HomeController {
 
}
cs

 

Controller 객체 - @RequestMapping

설정한 URL로 매핑이 되도록 한다.

@RequestMappint("/success")
public String success(Model model) {
 
    return "success";
}
cs

 

Controller 객체 - Model 타입의 파라미터

개발자는 Model 객체에 데이터를 담아서 DispatcherServlet에 전달할 수 있다. DispatcherServlet에 전달된 Model 데이터는 View에서 가공되어 클라이언트에게 응답처리된다.

model.setAttribute("tempData""model has data!!");
cs

 

@RequestMapping("/success")
public String success(Model model) {
 
    return "success";
}
cs

 

View 객체

스프링 설정 파일에 InternalResourceViewResolver라는 빈(Bean) 객체를 생성하는데, InternalResourceViewResolver는 prefix, 리턴 값, suffix 값을 합쳐서 적절한 View 파일로 매핑하는 역할을 한다.

/WEB-INF/views/success.jsp

@RequestMapping("/success")
public String success(Model model) {
 
    return "success";
}
cs

 

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

Colored by Color Scripter

cs

posted by DevMoomin
:
Spring/Study 2020. 4. 13. 17:10

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)

 

하나의 설정 파일로 관리를 하다 보면 소스가 길어지면서 유지보수가 어려워질 수 있다. 따라서 설정 파일을 기능별로 분리해서 사용하는 것이 효율적이다.

 

배열 형식으로 넣어주는 방법

MainClass.java

public class MainClass {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = 
                new AnnotationConfigApplicationContext(MemberConfig1.class, MemberConfig2.class, MemberConfig3.class);
        
        EMSInformationService informationService = ctx.getBean("informationService", EMSInformationService.class);
        informationService.outputEMSInformation();
        
        ctx.close();    
    }
}
cs

 

@import 어노테이션을 사용하는 방법

MemberConfigImport.java

@Configuration
@Import({MemberConfig2.class, MemberConfig3.class})
public class MemberConfigImport {
    @Bean
    public StudentDao studentDao() {
        return new StudentDao();
    }    
}
cs

MainClass.java

public class MainClass {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = 
                new AnnotationConfigApplicationContext(MemberConfigImport.class);
        
        EMSInformationService informationService = ctx.getBean("informationService", EMSInformationService.class);
        informationService.outputEMSInformation();
 
        ctx.close();    
    }
}

Colored by Color Scripter

cs

posted by DevMoomin
: