본문 바로가기
Coding/spring

1학기 복습타임!

by 찡콩찡 2022. 8. 19.
새 프로젝트를 시작해보자! 

 

회사에서는 회사 도메인을 사용함 kr.co.poly.projectName

프로젝트 구성 목록은 이렇게 됩니다! 

프로젝트 생성하면 이렇게 생겨요!


java/ resource 파일에는 이런 일들을 해요!

 

 

자바코드는 여기에
소스
mapper 등등
스프링 설정파일
meaven 설정파일
웹애플리케이션 전체설정 파일


자비 사용 버전을 올리기위해 pox.xml에서 자바 버전을 1.8로 수정

기존 셋팅을 바꿔준다.
<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>

 

컴파일러 수정  프로포티값을써주기

톰캣수정! 버전을 올려야 함! jsp와 servelt-api버전을 맞게 수정! 

메이븐 저장소 사이트

 

myapp/pom.xml을 켜서 아래와 같이 servlet을 수정해준다.

설정이 마무리 되면 Update Project를 해준다.

update를 하고 web.xml 폴더를 열면 아래와 같은 오류가 뜬다! 왜?

버전이 안맞어서 그래요 우리가 3.1로 옮겼으니까 맞춰줘야 해

버전이 맞지 않아서 그래요!

서블릿에 맞춰서 변경해주자  3.1 버전에 맞는걸 가져다 써야해 그게 어딨냐면 servers에 있는 tomcat config에 있음! 

tomcat 아래에 있는 web.xml은

톰캣 자체가 가지고 있는 webv.mxl에서 실행되는 모든 웹애플리케이션의 공통적으로 적용되는 것

그 파일 안에 있는 아래 문장을  app.xml에 넣어준다.

 

<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

app.xml web-app 버전 수정

이렇게 화면이 뜬다! 

 


배포 폴더

확장자 매핑을 해서 .do(확장자)로 끝나는 것만 dispatcherservlet이 실행 여기 해당안되는건 tomcat이 알아서 하게 설정함

servlet container : tomcat은 서블릿 밖에 실행을 함 

jsp실행 등 다 는 이유는 톰캣에서 서블릿 실행을 할 수 있게 설정을 다 해주기 때문이다.

아래의 사진과 같이 여러개의 서블릿이 등록되어있기 때문에 tomcat으로 여러가지가 실행되는 것 

톰캣이 등록해놓은 jsp가 실행되는 것

 

default servlet을 등록하는 경로는 / 임 : 그래서 정적인 동작도 실행할 수 있었음! 

 

노란색 줄 주석처리 후 아래에 <default-servlet-handler/>를 추가한다.

<default-servlet-handler/>는 스프링의 DispatcherServelt이 요청 경로에 맞는 핸들러를 찾지 못한 경우
그 요청을 처리할 디폴트서블릿핸들러를 등록 (디폴트서블릿핸들러라는 요청 처리를 서버(톰캣)의 DefaultServlet에게 위임) 하는 역할을 한다. 


웹브라우저에서 http://localhost:8000/myapp/test.do로 요청을 보내면
이클립스 콘솔에 "TEST!"라고 출력되도록 구현

이렇게 밖에 처음에 작성을 못했다....ㅜㅜ 아직 많이 부족한가봐

	@RequestMapping(value = "/test.do", method = RequestMethod.GET)
		public String 
	{
		System.out.println("test!");
	}

가장 쉬운 방법은 경로 요청을 보냈을 때 자바코드가 실행되려려면 스프링을 통해 하려면  System.out.println("test!");를 담고 있는 컨트롤러가 있어야 함

어디다 만들건지는 스프링 파일을 봐야해요

<context:component-scan base-package="com.exam.myapp" /> 아래에 작성하면 됩니다.

com.exam.myapp 아래쪽에만 있으면 됩니다. 설정이 되면 스프링이 스캔하여 실행

컨트롤러는 어디다 만드냐가 중요! 경로를 잘 살펴보자

스프링 어노테이션 종류
@Component : 특별한 기능 없이 스프링에 사용한다는  의미@Controller
@Service
@Repository
@Configuration
@ControllerAdvice

예제1 

TestController.java

package com.exam.myapp;

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


//웹브라우저에서 
//http://localhost:8000/myapp/test.do로 요청을 보내면
//이클립스 콘솔에 "TEST!"라고 출력되도록 구현
//System.out.println("test!");


@Controller  //웹 요청이 왔을 때 실행되는 코드를 담고 있는 클래스를 의미
public class TestController {
	
	//1. 실행할 메서드 만들어주기
	//2. 약속된 어노테이션 붙여주기 : @RequestMapping 요청이 왔을 때 경로를 받아서 실행하는 것! 
	@RequestMapping("/test.do")
	public void test() {		
		System.out.println("test!");
	}
}

 

 

★ 메서드 공부하기 :

 

예제2

웹브라우저 화면에 "테스트화면에"이라고 출력되도록 구현..
TestController.java

@Controller  //웹 요청이 왔을 때 실행되는 코드를 담고 있는 클래스를 의미
public class TestController {

	//웹브라우저 화면에 "테스트화면에"이라고 출력되도록 구현
	//jsp파일을 만들고,
	//컨트롤러가 실행후 그 jsp파일이 실행되도록 구현
	
	@RequestMapping("/test.do")
	public String test() {		
		return "test";
	}

아래와 같이 return와 String을 void로 변경해도 화면이 나올까? 

나온다!!!

@Controller  //웹 요청이 왔을 때 실행되는 코드를 담고 있는 클래스를 의미
public class TestController {
	
	//스프링이 컨트롤러 실행 후 뷰에 대한 정보를 받지 못하면,
	//DefaultRequestToViewNameTranslator를 사용하여 뷰 이름을 자동생성
    //현재 요청경로에서 컨텍스트패스까지 삭제하고, 
	//맨 앞의 /와 맨 뒤의 확장자를 제거하여 뷰이름으로 사용
	
	@RequestMapping("/test.do")
	public void test() {		
	System.out.println("test!");
//		return "test";
	}
	
	
}

예제3

http://localhost:8000/myapp/test.do?x=3&y4로 요청을 보내면
웹브라우저 화면에 "x+y =7"이라고 출력되록 변경

1단계: 인자를 선언한다.

//1.먼저 인자 선언 문자열이면 String 
	@RequestMapping("/test.do")
	public String test(int x, int y    ){							
		System.out.println("");
		return "test";
	}

2단계 종류골라

@RequestMapping("/test.do")
	public String test(int x, int y, Model model, Map map, ModModelMap modelMap){
		//1-1변수값을 jsp에서 쓰고 싶다하면 모델에 포함시켜야 함
		//1-2매게변수를 모델 넣어주기
		System.out.println("test");
		int sum =x+y;
		model.addAttribute("result", sum)
		Map.put("result", sum);
		ModelMap.addAttribute("result", sum)
		return "test";
	}

jsp화면

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>테스트 화면</h1>
	<h2>x+y =${result}</h2>
</body>
</html>

최종 코드

//1.먼저 인자 선언 문자열이면 String 
	@RequestMapping("/test.do")
	public String test(int x, int y,Map map){
		//1-1변수값을 jsp에서 쓰고 싶다하면 모델에 포함시켜야 함
		//1-2매게변수를 모델 넣어주기
		System.out.println("test");
		int sum =x+y;
		map.put("result",sum);
		
		return "test";

 

변수가 필드로 받는 객체를 만들어서 그걸 통해서 여러개를 뿌려야 할때 

클래스를 만들어주고 객체를 정해서 컨트롤러에서 한번에 받을 수 있음

(파라미터가 많으면 객체를 만드는게 좋다! )

   1. 먼저 변수를 받을 vo class를 만든다. 

package com.exam.myapp;

public class TestVo {
	//파라미터를 받는다고 할때 파라미터 변수랑 같은 이름이 있어야 함
	private int x;
	private int y;
	
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	
	
}

2. controller를 작성한다.

	//1.먼저 인자 선언 문자열이면 String 
	@RequestMapping("/test.do")
	public String test(TestVo vo,Map map){
    
		//TestVo.vo 안에는 int x 값과 int y값이 들어가있음
		//파라미터가 여러개여도 vo에 담아서 코드가 간단해짐

		System.out.println("test");
		int sum =vo.getX()+vo.getY();
		map.put("result",sum);
		
		return "test";
	}

3.jsp를 작성한다.

<body>
	<h1>테스트 화면</h1>
	<h2>x+y =${result}</h2>
</body>
</html>

4. 결과를 확인한다.

 

 


세상에는 다양한 라이브러리가 있는 것 같다!  lombok을 설치하자! 

lombok 라이브러리 

쓰고 있는 이클립스로 경로를 지정해줘서 설치하라고 한다.

설치 후 재 시작을 해준다.

잘 설치됨을 확인하였다.

 

 

pom.xml에 추가 아래의 문장 추가

	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.24</version>
		<scope>provided</scope>
	</dependency>

TestVo에 get & setter지워보고  vo에 아래와 같이 다시 작성해보자

package com.exam.myapp;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter  //lombok을 이용하여, 클래스의 모든 필드(멤버 변수)의  getXxx() 메서드 자동생성 
	// lombok을 이용하여, 클래스의 final이 아닌 모든 필드(멤버 변수)의  setXxx() 메서드 자동생성 

public class TestVo {
	//파라미터를 받는다고 할때 파라미터 변수랑 같은 이름이 있어야 함
	private int x;
	private int y;
	
	
	
}

다시 실행해본다! 결과는?

예제4

한글 파라미터 인코딩 설정

* get방식 요청의 파라미터 인코딩 설정
    서버 (톰캣)의 설정파일(server.xml) 파일에 설정
    HTTP를 담당하는 <Connector>에 URIEncoding="UTF-8" 추가

* post 방식 요청의 파라미터 인코딩 설정 (필터이용)
  web.xml 파일에 톰캣 또는 스프링이 제공하는 인코딩필터를 등록

<Connector connectionTimeout="20000" port="8000" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

 POST는 필터이용! 검색창에 전자정부프레임워크를 검색한다.

    <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>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

 

form태그 활용

 

home.jsp에 아래와 같이 작성해준다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>

	<form action="">
		x : <input type="text"/> <br /> 
		y : <input type="text"/> <br />
		<input type="submit" value="전송" />
	</form>
</body>
</html>

예제5  

x,y값을 입력하고 전송버튼을 클릭하면, test.do로 요청이 전송되어 화면에 x+y= 두 수의 합 출력되도록
get으로 했을 때

1. 일단 내가  인터넷 보면서 작성한 코드인데 아래와 같은 오류가 났다. 어떤 점이 문제인지 찾아보자

분명 공부하면 너무 창피할 코드인것같지만 해볼거다

	<form action="/test.do" method="get">
		x : <input type="text" name="x"/> <br /> 
		y : <input type="text" name="y"/> <br />
		<input type="submit" value="전송" />
	</form>

 

form을 눌렀을 때. 경로를 이동할 수 있게끔 아래와 같이 작성해준다.

왜 contextpath를 붙여준다는걸까?

<%--contextpath를 쓰지않을거면 <c:url value="/test.do"/> contextpath를 자동으로 붙여준다. --%>
	    <form action="${pageContext.request.contextPath}/test.do" method="get">
		x : <input type="text" name="x"/> <br /> 
		y : <input type="text" name="y"/> <br />
		<input type="submit" value="전송" />		
		
	</form>

 

post로 설정해보기

<form action="${pageContext.request.contextPath}/test.do" method="post">
		x : <input type="text" name="x"/> <br /> 
		y : <input type="text" name="y"/> <br />
		<input type="submit" value="전송" />	
</form>

 

예제6.

전송버튼을 클릭하면
이클립스 콘솔에 선택한 음식들이 출력 (pizza, sand, spa)
웹 브라우저 화면에 선택한 음식들이 리스트<li> 엘리먼트들로 출력

 

  1. 먼저 vo 작성

	//선택한 음식을 받을 수 있는 변수를 선언한다. 
	//요청파라미터값과 변수명이 같아야 받아진다. = food
    //리스트로 받아보자 주석과 같이 배열로도 가능하다! 
    
	private List<String> food = new ArrayList<String>(); //String[]

  2. 컨트롤러에서 출력해보기

	@RequestMapping("/test.do")

	public String test(TestVo vo,Map map){
		//TestVo.vo 안에는 food 값이 들어가있음
		//파라미터가 여러개여도 vo에 담아서 코드가 간단해짐

		System.out.println("test");
		for(String f :vo.getFood()) {
        System.out.println(f);			
		}
		
		return "test";
	}

  3. 리스트<li>로 test.jsp에서 출력할 때는

4. controller에 test.vo에 대해 작성한다.

 5. 결과

'Coding > spring' 카테고리의 다른 글

부트스트랩 이용해서 에러메세지 띄워보기  (1) 2022.09.23
회원정보 수정  (0) 2022.09.16
Jquery를 활용한 예제  (0) 2022.08.26
인강 복습 : [회원관리] 유효성 처리 검사  (0) 2022.08.24
[공부note]  (0) 2022.08.24