728x90
300x250

[JSP] 22. JSP/Servlet MVC2 - jQuery기반의 Ajax POST 전송 및 MVC패턴 Action 식별자


jQuery를 활용하는 방법에 대해서 소개하려고 한다.

그림 일기 수준으로 매우 편안한 마음으로 입문할 수 있는 학습 기반을 제공해주려고 한다.

심도적인 부분은 전문서적 등도 찾아보기도 하고, 검색도 많이 해보시면 좋을 듯 싶다. (변화가 워낙 빠른 분야인 만큼)



1. 결과


동적인 부분인 관계로 영상으로 올려주도록 하겠다.



영상 1. 출력 결과


jQuery가 어떤 결과물을 만들어 내는 도구인지 이해가 되었으면 하는 바램이다.

원래는 jQuery가 먼저 나온 것이 아니고, Javascript가 먼저이다.


그리고 2006년도에 약 Ajax라는 규격이 나왔는데, Javascript 파일 형태로 ajax 파일을 배포하여 동적인 처리에 대해서 접근하게 되었다.


그리고 조금 시간이 지나서 jQuery라는 게 나왔는데, 분명한 건 이건 표준은 아니다.

다만, 편하게 사용하도록 도와주는 오픈소스 진형의 library이다.




2. 프로젝트 생성하기


이러한 저차원 수준으로 작성한 이유는 프로그래밍에 겁먹지 말라는 것이다.



그림 1. 프로젝트 생성하기


File -> New -> Maven Project를 클릭한다.



그림 2. 프로젝트 생성하기


org.apache.maven.archetypes | maven-archetype-webapp를 선택한다.

Next를 클릭한다.


검색 키워드로 검색할 때, "webapp"로 하면, 조금 찾는데 시간이 절약될 수 있다.

다만, HDD 사용자는 조금 버벅될 가능성이 있다. (검색 기능이 매우 느림.)




그림 3. 프로젝트 생성하기


GroupId, Artifact Id를 적당히 입력한 후 Finish를 누른다.



3. Pom.xml - 설정하기


http://mvnrepository.com에 들어가서 "servlet"을 검색해서 최신 버전으로 해준다.

Maven Project를 아끼고 있는 이유는 정말 사용하기가 편리하다.


셋팅하는데, /src/main/webapp/WEB-INF/lib인가 폴더에 넣고, 프로젝트 속성에 들어가서 BuildPath 클릭하고 Add External Library 등록하고 

확인 몇 번하고 복잡했는데, Maven을 알게 되면서 많이 좋아진 것 같다.



그림 4. pom.xml


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


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>


  <groupId>com.webedu</groupId>

  <artifactId>exampleAjax</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>


  <name>exampleAjax Maven Webapp</name>

  <!-- FIXME change it to the project's website -->

  <url>http://www.example.com</url>


  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <maven.compiler.source>1.7</maven.compiler.source>

    <maven.compiler.target>1.7</maven.compiler.target>

  </properties>


  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.11</version>

      <scope>test</scope>

    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>

  </dependencies>


  <build>

    <finalName>exampleAjax</finalName>

    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->

      <plugins>

        <plugin>

          <artifactId>maven-clean-plugin</artifactId>

          <version>3.1.0</version>

        </plugin>

        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->

        <plugin>

          <artifactId>maven-resources-plugin</artifactId>

          <version>3.0.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-compiler-plugin</artifactId>

          <version>3.8.0</version>

        </plugin>

        <plugin>

          <artifactId>maven-surefire-plugin</artifactId>

          <version>2.22.1</version>

        </plugin>

        <plugin>

          <artifactId>maven-war-plugin</artifactId>

          <version>3.2.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-install-plugin</artifactId>

          <version>2.5.2</version>

        </plugin>

        <plugin>

          <artifactId>maven-deploy-plugin</artifactId>

          <version>2.8.2</version>

        </plugin>

      </plugins>

    </pluginManagement>

  </build>

</project>



파일명: pom.xml


[첨부(Attachments)]

pom.zip




4. Project Factes와 Build Path - 자바 버전 바꿔주기


자바 버전을 변경해줘야 한다. Maven Project 초기 셋팅이 현재 1.6으로 잡혀서 생성되기 때문이다.



그림 5. 프로젝트의 오른쪽 메뉴 모습


프로젝트를 선택한 후, 마우스 오른쪽 버튼을 클릭한다.

Properties를 클릭한다.



그림 6. Build-Path


JRE System Library [JavaSE-14]로 바꿔준다.

Edit 버튼을 누르면 바꿀 수 있다.



그림 7. Project Factes


Java의 버전을 14로 바꿔준다.




5. jQuery 사이트 - 접속하기


인터넷 웹 브라우저를 켠다.


그림 8. 윈도우 10 - 엣지 클릭하기


웹 브라우저 아이콘을 못 찾는 경우에는 그림처럼 생긴 거 클릭하면 된다. 

(그 옆에도 비슷하게 생긴 e자 아이콘을 클릭해도 무방하다.)



그림 11. jQuery 웹 사이트 접속하기


https://jquery.com/download


링크를 웹 주소창에 입력해서 접속한다.

또는 클릭해도 무방하다.


표기해놓은 것 5개 중 하나만 잘 다운로드 받으면 된다.




그림 12. jQuery 다운받기


문서 클릭\workspace-spring-tool-suite-4-4.7.2.RELEASE\{프로젝트명}\src\main\webapp\js에 저장해준다.

js폴더가 없으니깐 하나 만들어준다.

js폴더 안에 저장해준다.



영상 2. jQuery 다운로드 받는 모습



6. jQuery - ajaxPost - API 접속하기


https://api.jquery.com/jquery.post/


사이트에 접속해준다.



그림 13. jQuery 예제


이렇게 생긴 HTML태그를 복사하여 Eclipse에 옮겨갈 것이다.

참고로 이 코드가 완벽한 코드는 절대 아니다. (태스트 해 봤음.)




그림 14. index.jsp 파일에 복사 붙여넣기 해주기


그림 14와는 다르게 태스트를 완료한 코드는 아래에 있으니 참고하면 되겠다.

WEB-INF내에 views폴더 생성해준다.

그리고 index.jsp 파일을 views 폴더 안으로 이동해준다.



영상 3. views 폴더 생성 방법 및 파일 이동 시키기



그림 15. 이동을 완료한 모습 - views 폴더 내용


<!doctype html>

<html lang="en">

<head>

<meta charset="utf-8">

<title>jQuery.post demo</title>

<script src="js/jquery-3.5.1.js"></script>


</head>

<body>

 

<form action="board/insert.do" id="searchForm">

  <input type="text" name="s" placeholder="Search...">

  <input type="submit" value="Search">

</form>

<div id="result"></div>


<script type="text/javascript">

// Attach a submit handler to the form

$( "#searchForm" ).submit(function( event ) {

 

  // Stop form from submitting normally

  event.preventDefault();

 

// Get some values from elements on the page:

  var $form = $( this ),

    term = $form.find( "input[name='s']" ).val(),

    url = $form.attr( "action" );

 

  // Send the data using post

  var posting = $.post( url, { s: term } );

 

  // Put the results in a div

  posting.done(function( data ) {

    alert( "Data Loaded: " + data );

    var content = data ;

    $( "#result" ).html( content );

   

  });

 

});


</script>

<!-- the result of the search will be rendered inside this div --> 

 

</body>

</html>


파일명: index.jsp


[첨부(Attachments)]

index.zip




7. Servlet 작성하기


MVC2 패턴을 만들거니깐 서블렛을 잘 따라 해야 한다.



그림 16. Java Resources 폴더 - 마우스 오른쪽 버튼 메뉴 모습


Java Resources 폴더를 선택한 후, 마우스 오른쪽 버튼으로 클릭한다.

New-> Servlet을 클릭한다.



그림 17. Servlet 생성 작업창 - 모습 (Create Servlet)


Java Package명을 입력한다. (예: com.example.web.controller)

Class Name명을 입력한다. (예: FrontController)


Finish를 누른다.



8. web.xml 파일 - 수정작업하기


경로 위치: /src/main/webapp/WEB-INF/web.xml


문자열하고, FrontController의 *.do로 변경 작업을 해주면 된다.



그림 18. web.xml - 수정작업하기


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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">

  <display-name>Archetype Created Web Application</display-name>

  <servlet>

  <servlet-name>FrontController</servlet-name>

  <servlet-class>com.example.web.controller.FrontController</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet-mapping>

  <servlet-name>FrontController</servlet-name>

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

  </servlet-mapping>

</web-app>



파일명: web.xml


[첨부(Attachments)]

web.zip




9. Class 만들기 - HttpUtil


HttpUtil 클래스를 만들어주려고 한다.



그림 19. Java Resources의 오른쪽 버튼 메뉴 모습


Java Resources를 마우스 오른쪽 버튼으로 클릭한다.

New->Class를 클릭한다.



그림 20. 클래스 생성 마법사 모습


Package명은 com.example.web.util

Name은 HttpUtil로 한다.


Finish를 누른다.





그림 21. 코드를 입력한 모습 - HttpUtil.java


package com.example.web.util;


import java.io.IOException;


import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class HttpUtil extends HttpServlet {


private static final long serialVersionUID = 1L;


private static String charset = null;


public static void forward(HttpServletRequest req, HttpServletResponse res,

String path) throws ServletException, IOException {


try {

RequestDispatcher dispatcher = req.getRequestDispatcher(path);

dispatcher.forward(req, res);


}catch(Exception e) {

e.printStackTrace();

}

}

}


파일명: HttpUtil.java


[첨부(Attachments)]

HttpUtil.zip



10. Controller - Interface 만들기


Controller 인터페이스를 하나 만들 것이다.



그림 22. Controller.java


package com.example.web.controller;


import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {


public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException;


}




파일명: Controller.java


[첨부(Attachments)]

Controller.zip



11. InsertController.java - Class


앞서 만든 Interface(Controller)로 InsertController.java를 작성할 것이다.



그림 23. InsertController.java


Package 명은 com.example.web.board라고 입력한다.

Name명은 InsertController라고 입력한다.


Interfaces의 Add버튼을 누른다.



그림 24. Implemented Interfaces.......


Controller를 입력한 후 작성한 Controller 인터페이스를 선탁한다.

OK를 누른다.

Finish를 누른다.


package com.example.web.controller.board;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.example.web.controller.Controller;

import com.example.web.util.HttpUtil;


public class InsertController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

HttpUtil.forward(req, res, "/WEB-INF/views/board/insert.jsp");


}


}



파일명: InsertController.java


[첨부(Attachments)]

InsertController.zip



13. FrontController - 코드 작성하기 (수정)


코드를 자세히 보면, flag가 추가되었다.

doAction에서 POST, GET 등을 인식할 수 있게 되었다.


package com.example.web.controller;


import java.io.IOException;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import com.example.web.controller.board.InsertController;

import com.example.web.util.HttpUtil;


public class FrontController extends HttpServlet {

private static final long serialVersionUID = 1L;

private String charset = null;

       

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

doAction(req, res, "GET");

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

       doAction(req, res, "POST");

}


protected void doAction(HttpServletRequest req, 

HttpServletResponse res,

String flag) 

throws ServletException, IOException {

ServletConfig sc = this.getServletConfig();

charset = sc.getInitParameter("charset");


req.setAttribute("charset", charset);

req.setCharacterEncoding(charset);

res.setContentType("text/html; charset=" + charset);


String uri = req.getRequestURI();

String conPath = req.getContextPath();

String command = uri.substring(conPath.length());


Controller subController = null;


// POST 전송방식만

if(command.equals("/board/insert.do") && 

flag.contentEquals("POST")){


System.out.println("insert");

System.out.println("----------------");

subController = new InsertController();

subController.execute(req, res);

}else if (command.equals("/index.do")){

HttpUtil.forward(req, res, "/WEB-INF/views/index.jsp");

}

}

}



파일명: FrontController.java


[첨부(Attachments)]

FrontController.zip



14. View - webapp/WEB-INF/views/board/insert.jsp


POST처리 후에 출력할 페이지를 작성하도록 하겠다.

PrintWriter out으로 해도 무방하지만, MVC패턴을 적용했으니 뷰 파일에서 작성하겠다.


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

String text = (String)request.getParameter("s");

%>

<%= text %>


파일명: insert.jsp


[첨부(Attachments)]

insert.zip



* 맺음글(Conclusion)


jQuery를 통해서 ajax 전송에 대해서 간단한 형태로 살펴보았다.

반응형
728x90
300x250

[Spring-Framework] 21(번외). STS 4.4 - Spring Boot Starter 프로젝트 생성(MVC)


나의 글에서 주로 Spring Legacy Project로 환경구축에 대해서 다루었다.

하지만, 초기 STS 4.4 최신버전을 설치하면 Spring Legacy Project는 따로 구성해줘야 사용할 수 있게 된다.

(Help -> Eclipse Marketplace -> "검색어: sts" -> "Spring Tools 3 Add-on for Spring Tools 4 3.9.14.RELEASE")


Spring Boot를 소개하게 된 건, 셋팅에 있어서 그동안 조금 복잡한 과정을 거쳐야 했었는데 그런 걸 "통폐합"해서 간단하게 사용할 수 있도록 도와주고 있다.


알 필요성이 있다고 생각되서 작성하게 되었다.


[기대 효과]

(장점)

1. 복잡한 셋팅을 안 해도 된다

2. 빠른 작업이 가능해진다.


(단점)

1. Spring Framework 위주의 자동생성에서 벗어나질 못한다. ???






1. 프로젝트 생성하기


처음으로 Spring Starter Project를 생성하는 방법에 대해서 소개하도록 하겠다.



그림 1. 프로젝트 시작하기


File -> New -> Spring Starter Project를 클릭한다.



그림 2. 프로젝트 시작하기(2)


셋팅을 조금 해주면 된다.


Group명, Artifacte, Package, Description 등을 수정해도 된다.

자바 버전 등도 셋팅할 수 있다.

셋팅이 완료되었다면, Next를 클릭한다.



그림 3. 프로젝트 시작하기(3)


MySQL Driver, Oracle Driver, Spring Security, Spring Web Services를 체크한다.

Next를 누른다.



그림 4. 프로젝트 시작하기(4)


Finish를 누르면 프로젝트가 생성된다.



2. Spring Boot(Spring Starter)에서는 서블렛(Servlet) 지원하나요?


Servlet 기능이 되는지 궁금한 분들을 위해서 작성하였다.



그림 5. Servlet 생성하기 전의 모습 (결론: 생성 안 됨.)


Next를 클릭해보면, 생성할 수 없다고 나온다.


3. Run - Hello World


Spring Security를 체크한 경우에는 아래의 화면을 볼 수 있다.

Hello World 화면이라고 생각하면 된다.



그림 6. Run 누르면, 내장 톰캣으로 돌아감.


Run 아이콘을 클릭하면, 내장 톰캣 서버가 돌아간다.

웹 브라우저를 수동으로 열어서 호출 시켜보면 이런 화면이 나오면 정상이라고 보면 된다.



4. REST - 활용한 Controller "Hello, World"


REST에 대해서 소개한 적이 있다.

SpringBoot 데모에서는 JSP 파일이 없어서 REST로 태스트를 진행해야 한다.



그림 7. 클래스 만들기(1)


com.spring. (패키지폴더)를 마우스 오른쪽 버튼으로 클릭한다.

New -> Class를 클릭한다.



그림 8. 클래스 만들기(2)


예로 HomeController라고 입력하고 Finish를 누른다.

이름을 임의로 임력한다고 해서 큰 문제가 되진 않는다.




그림 9. 콘트롤러 코드 작성하기


이처럼 코드를 작성해준다.


package com.springmvc.home;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class HomeController {

@RequestMapping("/")

public @ResponseBody String home() throws Exception{

return "home";

}

}




그림 9-1, 그림 9-2. 서버 실행과 내장 웹 브라우저 사용방법, JavaEE 인터페이스 화면


모르겠으면 한번씩 눌러보길 바란다.




그림 10. 빌드 - 웹 브라우저 열어보기(1)


계정 아이디: user

비밀번호는 Using generated security password에 생성된 보안키가 비밀번호이다.


입력하고 로그인을 눌러본다.



그림 11. 빌드 - 웹 브라우저 열어보기(2)


내장 이클립스 웹 브라우저에서는 화면이 안 보이는데, 엣지나 크롬의 경우에서는 출력된 REST 화면을 볼 수 있다.




5. Web기반 - Controller 작성하기


이번에는 다소 세팅 작업이 몇 가지가 있는데 일반 jsp 웹 페이지를 출력할 수 있는 Controller(컨트롤러) 생성에 대해서 소개하겠다.



그림 12. 클래스 생성하기 (1)


패키지를 마우스 오른쪽 버튼으로 클릭한다.

New->Class를 클릭한다.




그림 13. 클래스 생성하기 (2)


Superclass의 Browse를 클릭한다.

WebSecu를 검색하면, "WebSecurityConfigurerAdapter를 선택한다.

OK를 누른다.


클래스명(Name)은 WebSecConfig를 입력한다.

Finish를 누른다.



그림 14. 클래스 생성하기 (3)


그림 14처럼 생성되면 잘 생성된 것이다.

복잡하게 코드를 만드는 게 아니다.



그림 15. 클래스 생성하기 (4)


Source -> Override/Implement Methods를 클릭한다.




그림 16. Override / Implement Methods


configure(HttpSecurity)를 체크하고 OK를 누른다.





5-1 Web기반 - SecurityConfig 설정하기


이 글을 조금 심화적으로 이해하려면, Spring Security 부분을 참고하면 된다.

자랑하는 건 아니지만, 필자의 글이 가장 잘 나와있다고 소개하고 싶다.



그림 17. Spring Security 설정하기



package com.springmvc.home.security;


import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/").permitAll()

.antMatchers("/welcome").permitAll()

.antMatchers("/page1").hasRole("ADMIN")

.anyRequest().authenticated();

}


}



파일명: WebSecurityConfig.java


[첨부(Attachments)]

WebSecurityConfig.zip




5-2 Web기반 - HomeController.java 파일 수정하기


파일 수정을 조금 해줘야 한다.

아까 전에 만든 HomeController를 변형하도록 하겠다.


파일: com.springmvc.home.HomeController.java



그림 18. HomeController.java 만들기


package com.springmvc.home;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class HomeController {

@RequestMapping("/")

public @ResponseBody String home() throws Exception{

return "home";

}


@RequestMapping("/page1")

public @ResponseBody String page1() throws Exception{

return "Spring Boot : 1";

}

@RequestMapping("/page2")

public @ResponseBody String page2() throws Exception{

return "Spring Boot : 2";

}

}



파일명: HomeController.java


[첨부(Attachments)]

HomeController.zip


이전의 STS ("Legacy로 작업할 때, 웹 브라우저에 자동으로 재빌드되었다.")와는 다른 점이 빌드가 조금 느리게 반응하거나 수동 빌드를 해줘야 한다.

화면이 안 바뀌면, 다시 실행(Run)을 해보기 바란다. 버그가 전혀 없는 건 아니다.




그림 19. 출력 결과 - 확인하기(1)






그림 20. 출력 결과 - 확인하기(2)





6. Web기반 - WelcomeController 생성(Controller)


그림 20의 문제를 해결할 겸 Web기반 페이지를 작성하는 방법에 대해서 소개하겠다.



그림 21. 패키지 오른쪽 버튼 메뉴


com..... 패키지를 선택한다.

마우스 오른쪽 버튼 클릭한 후, New-> Class를 클릭한다.




그림 22. WelcomeController.java 생성하기


Name: "WelcomeController"

Finish를 클릭한다.



그림 23. 코드를 입력한 상태의 WelcomeController


초기에는 코드가 전혀 입력되어 있지 않다.

그림 23처럼 입력해준다.


package com.springmvc.home;


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class WelcomeController {


@RequestMapping("/welcome")

public String welcome() {

return "welcome";

}

}



파일명: WelcomeController.java


[첨부(Attachments)]

WelcomeController.zip






7. application.properties 설정 - 웹 경로


웹 페이지를 사용하려면, 경로를 설정해줘야 한다.

이전 Spring Legacy나 maven project로 프로젝트를 생성했다면, web.xml가 존재했었다.

application.properties로 통합된 것으로 보인다.




그림 24. 코드를 입력한 상태의 application.properties


spring.mvc.view.prefix=/WEB-INF/views/

spring.mvc.view.suffix=.jsp


파일명: application.properties


[첨부(Attachments)]

application.zip




7-1. 웹 홈페이지 폴더와 jsp폴더 생성 - 웹 경로


이번에는 jsp 파일의 폴더를 생성하도록 하겠다.



그림 25. 폴더 만들기(1)


src/main 폴더를 오른쪽 버튼으로 클릭한다.

New->Folder를 클릭한다.




그림 26. 폴더 만들기(2)


webapp/WEB-INF/views를 입력한다.

Finish를 클릭한다.




그림 27. 파일 만들기


/src/main/webapp/WEB-INF/views 폴더 내에 파일을 만들어준다.

welcome.jsp 파일을 만든다.


서버를 재시작해준다.



그림 28. 로그인 후의 welcome(URL 주소)


그림 28의 화면이 뜨면, 잘 된 것이다.



7-2. CSS, Images, Javascript 경로


Css/images/Javascript의 경로에 관한 것이다.



그림 29. 결과 - 외부 CSS 적용


그림 29는 css 스타일이 적용된 결과이다. 



7-2-1. /src/main/java/resources/static/css/style.css


css 폴더는 /src/main/java/resources/static 내에 만들어주면 된다.

그리고 style.css 파일은 /src/main/java/resources/static/css 폴더에 만들어주면 된다.



그림 30. Style.css 위치



7-2-2. index.jsp 파일 수정하기


index.jsp 파일을 수정해주면 된다.



그림 31. index.jsp 파일 수정하기


<link rel="stylesheet" href="/css/style.css">


서버를 재시작하면 결과를 볼 수 있다.



그림 32. 출력 결과

반응형
728x90
300x250

[JSP] 16. 쿠키(Cookie) - 프로젝트(생성, 조회, 삭제)


쿠키에 대해서 소개하려고 한다.

쿠키라는 부분은 조작을 해버리면, 보안 자체가 매우 취약해서 사용 안 하는 것을 권장한다.

물론 전혀 사용 안 하는 것은 아니다.


쿠키는 서버 측으로부터 세션을 클라이언트로부터 내려받아서 세션 유지를 처리해주는 기술 중 하나이다.

서버와의 연결이 끊어져도 쿠키를 통해서 정보를 유지할 수 있다.


인터넷 검색을 시도 해보면, "특정 쿠키 변경"도 종종 검색되긴 하지만, 수 차례 태스트 결과로는 변경 작업은 시도 할 수 없다.

시도하려면, 쿠키를 전체 제거하고 다시 생성하는 방법 말고는 딱히 없다고 본다.



1. Cookie란?


쿠키란, 서버가 클라이언트에 저장하는 정보로써 클라이언트 쪽에 필요한 정보를 저장해놓고 필요할 때 추출하는 것을 지원하는 기술이다.


쿠키는 간단하게 구현할 수 있어서 "사용자 인증", "쇼핑몰 구축" 등에도 사용할 수 있지만, 브라우저에 저장되는 한계, 클라이언트가 직접 쿠키를 조작할 수 있기 때문에 보안에 취약해지는 단점이 있다.


- Cookie 생성 = new Cookie(String name, String value)

- 유효시간 설정 = setMaxAge(int expiry) 

- 쿠키 경로 설정 = setPath(String uri)

- 쿠키 도메인 설정 = setDomain(String domain)

- 쿠키 전송 = addCookie(Cookie cookie)


...... 쿠키는 직접 코드를 보는 게 훨씬 이해되는 데 도움된다고 주장한다.



2. Project 생성하기


이번 프로젝트는 꼭 반드시 Maven Project로 생성해야만 동작하는 건 아니다.

pom.xml을 사용하면, 라이브러리 관리가 수월해져서 그렇다.



그림 1. Maven Project 생성하기


org.apache.maven.archetypes  |   maven-archetype-webapp를 선택한 후 Next를 누른다.




그림 2. Maven Project 생성하기


Group ID와 Artifact Id를 입력한다.

Finish를 누른다.



3. pom.xml - 설정하기


이 글에서는 javax.servlet만을 추가하였다.



그림 3. Maven Project 생성하기




4. Servlet 생성하기


몇 가지 Servlet을 생성한다.



Java Resources에서 오른쪽 버튼을 누른다.

New->Servlet을 클릭한다.



그림 4. Servlet 생성 방법1


Java package명과 Class name명을 입력한다.

Finish를 누른다.




그림 5. Servlet 생성 방법2~4(반복)


그림 4의 동일한 방법으로 생성해준다.



5. web.xml - 설정하기


크게 많은 것을 작성한 건 아니다.

servlet 부분은 자동생성된 부분이다.

web-app, init-param 등 몇 가지를 수정, 추가하였다.


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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">

 

  <display-name>Archetype Created Web Application</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.do</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.do</welcome-file>

  </welcome-file-list>

  

  <servlet>

  <servlet-name>CookieTest1Servlet</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieTest1Servlet</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet>

  <servlet-name>CookieExtract</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieExtract</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet>

  <servlet-name>CookieAllRemove</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieAllRemove</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  <servlet>

  <servlet-name>CookieModify</servlet-name>

  <servlet-class>com.mavenCookie.web.CookieModify</servlet-class>

  <init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

  </servlet>

  

  <servlet-mapping>

  <servlet-name>CookieTest1Servlet</servlet-name>

  <url-pattern>/CookieTest1Servlet</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>CookieExtract</servlet-name>

  <url-pattern>/CookieExtract</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>CookieAllRemove</servlet-name>

  <url-pattern>/CookieAllRemove</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

  <servlet-name>CookieModify</servlet-name>

  <url-pattern>/CookieModify</url-pattern>

  </servlet-mapping>

</web-app>



파일명: web.xml


[첨부(Attachments)]

web.zip




6. index.jsp


index.jsp 파일이다.

확인 기능을 손쉽게 할 수 있도록 구현하였다.


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8"></meta>

<title>Cookie 태스트</title>

<style>

a{

text-decoration:none;

}

</style>

</head>

<body>


<h2>Hello World!</h2>


<h3>이클립스 웹에서는 확인 불가</h3>

<a href="CookieTest1Servlet">쿠키 생성</a><br/>

<a href="CookieExtract">쿠키 추출</a><br/>

<a href="CookieAllRemove">쿠키 전체 삭제</a><br/>

<a href="CookieModify">쿠키 변경(결론: 불가능)</a><br/>

<div style="width:400px; height:200px; background-color:#e2e2e2">

<h5>참고로 웹 브라우저에서 쿠키를 제거하는 옵션을 켜버리면 유지 자체에 의미가 없어짐.</h5>


</div>

</body>

</html>



파일명: insert.jsp


[첨부(Attachments)]

index.zip




7. Servlet - CookieTest1Servlet


쿠키 생성 방법에 대한 소스이다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class CookieTest1Servlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public CookieTest1Servlet() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

// 1. 쿠키 생성 - 기본 시간(브라우저 종료시 전송받은 쿠키 사라짐)

Cookie c1 = new Cookie("id", "userID");

c1.setPath("/");

res.addCookie(c1);

// 2. 쿠키 생성 - 쿠키 3시간 설정(60sec * 60Min * 3Hour)

Cookie c2 = new Cookie("mymy", "1234");

c2.setMaxAge(60 * 60 * 3);

c2.setPath("/");

res.addCookie(c2);

// 3. 쿠키 생성 - 쿠키 5일 설정(60sec * 60Min * 24Hour * 5Day)

Cookie c3 = new Cookie("subject", "zaza");

c3.setMaxAge(60 * 60 * 24 * 5);

c3.setPath("/"); // 경로는 루트로 지정함.

res.addCookie(c3);

out.println("쿠키 전송 완료<br/>");

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieTest1Servlet.java


[첨부(Attachments)]

CookieTest1Servlet.zip




8. Servlet - CookieExtract


쿠키 내용을 조회하는 방법에 관한 것이다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class CookieExtract extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public CookieExtract() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

Cookie[] list = req.getCookies();


// 삭제 여부 - 판별

if ( list != null ) {

out.print("유지 상태<br/>");

}else

{

out.print("삭제 완료<br/>");

}

// 쿠키 찾기(seq방식)

out.println("쿠키 검색1<br/>");

for ( int i = 0; list != null && i < list.length; i++ ) {

out.println( list[i].getName() + ":value=" + list[i].getValue() + "<br/>" );

}

// for 문 - 응용2

out.println("쿠키 검색2<br/>");

int i = 0;

for( Cookie cookie : list) {

out.println( list[i].getName() + ":value=" + list[i].getValue() + "<br/>" );

i++;

}

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieExtract.java


[첨부(Attachments)]

CookieExtract.zip



9. Servlet - CookieAllRemove


쿠키를 전체 삭제하는 방법이다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class CookieAllRemove extends HttpServlet {

private static final long serialVersionUID = 1L;


    public CookieAllRemove() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

Cookie[] list = req.getCookies();

for ( int i = 0; list != null && i < list.length; i++ ) {

// 만료처리 전

out.print( "이전 list[" + i + "]: " + list[i].getName() );

out.print( "<br/>" );

// 유효시간 0으로 설정하면 만료처리됨.

Cookie kc = new Cookie(list[i].getName(), null) ;

    kc.setMaxAge(0) ;

    kc.setPath("/");


// 응답에 쿠키 추가

res.addCookie(kc);

kc = null;

}

out.println("<br/>");

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieAllRemove.java


[첨부(Attachments)]

CookieAllRemove.zip



10. Servlet - CookieModify(안 되는 코드)


안 된다고 표기를 해둔 이유는 setValue 등으로 수정 후 넘기면 될 것 같지만, 전혀 되지 않는다.


package com.mavenCookie.web;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


/**

 * Servlet implementation class CookieModify

 */

public class CookieModify extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    public CookieModify() {

        super();

    }


protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {


ServletConfig sc = this.getServletConfig();

String charset = sc.getInitParameter("charset");

res.setContentType("text/html;charset=" + charset);

PrintWriter out = res.getWriter();

Cookie[] list = req.getCookies();

for ( Cookie cookie : list  ) {

if ( cookie.getName().equals("id")) {

cookie.setValue("haha");

res.addCookie(cookie);

}

}


out.println("<br/>");

out.println("<a href=\"index.jsp\">이전</a>");

out.close();

}


protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}


}



파일명: CookieModify.java


[첨부(Attachments)]

CookieModify.zip



* 맺음글(Conclusion)


쿠키 프로젝트로 가볍게 쿠키 사용 방법에 대해서 살펴보았다.

반응형
728x90
300x250

[JSP] 10. JSP 폴더 구성에 대한 것


이전 게시글을 따라 수행하면, 허점이 하나 있다는 것을 알 수 있다.

뷰 파일로 만든 .jsp파일을 직접 주소만 알게 되면, 접근할 수도 있다는 취약점이 있다.


1. [JSP] 9. MVC 디자인 패턴 - 초간단 이해, FrontController 패턴(1), 2020. 9. 20. 17:24

   https://yyman.tistory.com/1401


이러한 점을 설명하면서 알아두면 좋은 폴더의 구성에 대해서 소개하려고 한다.



[JSP 폴더에 대한 설명]


1) 프로젝트명/java resources/src/

   servlet, Class, Interface 등 예를 들면 java파일을 담는 곳

    - src 밑에 폴더 만들어서 작성  

      예) someFolder, SomeClass.java 식으로 사용


프로젝트를 개설해보면, 일부 살짝 차이가 있을 수 있겠으나 통상적으로 비슷하다.


2) 프로젝트명 "webContent"  

   - jsp 문서를 작성하면 된다.


3) 프로젝트명/webContent/WEB-INF/ 

   - 아래는 접근이 안됨, 보안 영역임.

    - 프로젝트명/webContent/WEB-INF/lib/  폴더에 각종

      jar 파일, ojdbc6 등을 붙여 넣어야 실행이 가능함.


※ jsp는 주소가 노출되어 있어서 공격을 받을 수 있다

    그래서, 

    @webServlet("*.do")와  같은 URL Mapping 어노테이션을 사용하여 URL 숨김 효과를 본다.

    또는 web.xml 에 정의하여 사용.





2. 9번 글 - 프로젝트에 적용해보기


WebContest에 있는 addressInsert.jsp와 addressList.jsp를 WEB-INF안에 view 폴더를 만들어서 이동시킨다.



그림 1) WEB-INF\view 폴더에 있는 jsp파일 실행시키기


jsp파일 경로를 입력하였으나 동작되지 않는 것을 확인할 수 있다.



2-1. 소스코드 변경하기


서블릿으로 WEB-INF\View에 있는 jsp파일을 사용하려면, 

AddressInsertController.java와 AddressListController.java의 파일 내용을 수정한다.



그림 2) 수정된 AddressInsert.java 파일



그림 3) 수정된 AddressList.java 파일


package com.eduJsp.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class AddressInsertController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws

ServletException, IOException{


HttpUtil.forward(req, res, "/WEB-INF/view/addressInsert.jsp");

}


}




package com.eduJsp.controller;


import java.io.IOException;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class AddressListController implements Controller {


@Override

public void execute(HttpServletRequest req, HttpServletResponse res) throws

ServletException, IOException {

HttpUtil.forward(req, res, "/WEB-INF/view/addressList.jsp");

}


}




3. 결과


서블릿을 통해서 결과를 확인해보면, 이해할 수 있을 것으로 보인다.



그림 4) Servlet 파일(*.do) - 호출하기



4. 작업내용 정리해보기


변경작업을 수행한 이력을 체크해본 것이다. 조금 알기 쉽게 표기해보았으니 참고하여 정리해보면 좋을 듯 하다.



그림 5) 프로젝트 구조 - 변경 사항


반응형

+ Recent posts