본문 바로가기

자바 웹을 다루는 기술

0904 STS설치부터 27장

이전에 이클립스에서 sTS를 설치한거는 프로젝트 생성도 안되고 spring 프로젝트 열어서 보는것도 안된다

 

https://dist.springsource.com/release/STS/index.html

 

https://dist.springsource.com/release/STS/index.html

Spring Tool Suite 3.9.12 3.9.12.RELEASE (Mrz 12, 2020) Spring Tool Suite 3.9.11 3.9.11.RELEASE (Dez 16, 2019) Spring Tool Suite 3.9.10 3.9.10.RELEASE (Sep 19, 2019) Spring Tool Suite 3.9.9 3.9.9.RELEASE (Jun 18, 2019) Spring Tool Suite 3.9.8 3.9.8.RELEASE

dist.springsource.com

 

이클립스를 설치한 폴더에 압축해제해준다. sts-3.9.12버전폴더만!!

 

 

 

 

이래도 오류뜨긴하는데 자바 버전 1.8로 변경하고 다시 IDE 재시작해주면 된당

프로젝트를 import하면 pom.xml에 에러가 뜬다. maven  플러그인이 하나 빠져서 그런다

pom.xml의 plugins태그 안에 추가해준다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.2</version>
</plugin>

프로젝트 생성은 안되서 jdk 11버전이 필요해서 시작한ㄷ!

 

jdk 11버전을 설치하고 sts.ini 파일을 설정한다.

-vm
C:\Program Files\Java\jdk-11\bin\javaw.exe

 

 

 

 

이제 프로젝트가 생성가능하다

패키지 명작성

 

servlet-context.xml

<annotation-driven />

이게 어노테이션을 통해서 controller,service ,DAO에 대해서 지정해주는 거 할려면 이거 지정해줘야함

<resource>

 이미지 css, java스크립트읽어올 경로 설정 -> 정적인 문서임을 명시

보통 resources폴더안에 넣어둠

<viewResolver클래스를 받는 beans 태그안에는>

property태그안에 prefix와 suffix 설정할 수잇는건 똑같다! 이걸 설정해두면 controller에서 jsp 이름만 리턴하면된다.

<context:component-scan/>에는 controller,service,DAO에 관한 클래스를 가져올 패키지명을 입력한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />
	<!-- class에서 controller,service,DAO에 대해서 지정해주는거 어노테이션쓸라고  -->

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<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>
	
	<context:component-scan base-package="com.myspring.pro27" />
	
	
	
</beans:beans>

web.xml

DispatcherServlet은 이제 servlet-context.xml파일을 읽어와서 view나  bean도 설정해준다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<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>

</web-app>

 

 

controller 에서 logger.info를 통해서 level을 설정해서 debug,warn,error,trace 사용가능

개발할때는 trace를 통해서 해당 실행파일 원리? 상세히 볼수 있다 info는 정보를 작성 warn 경고메세지, error 오류메세지

 

 

pom.xml 

프로그램 종속성과 버전에 관해서 설정하는 파일이다.

 

원래는 WEB-INF아래 lib이라는 폴더만들어서 jar관리하던걸 pom.xml에 글자만 넣어주면된다.

 

C:\Users\사용자명\.m2\repository ->maven이 실행되면 여기에 jar파일들이 관리된다. 만약에 프로젝트가 maven이 실행이 안될 때가 있다면 이 안의 폴더들을 다 삭제하고 다시 실행한다. -> 재 다운로드 되어서 실행 될거임

 

 

JSTL을 사용하기 위한 jar 추가하기

 

 

https://mvnrepository.com/

 

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

 

오라클의 OJDBC.jar는 저작구너이 있기때문에 lib파일안에 넣어놓고 dependency로 임포트해줘야한다.

 

<!-- 내가 lib아래의 경로를 명시적으로 설정해줘야한다.  -->
<dependency>
    <groupId>jdbc.oracle</groupId>
    <artifactId>OracleDriver</artifactId>
    <version>12.1.0.2.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ojdbc6.jar</systemPath>
</dependency>

1.8버전으로 jdk바꾸기

 

프로젝트에 에러가 안뜨게 하려면 libraries에 이 두가지만 있도록한다.

 

project facets도 수정한다음 4.0 1.8로 수정한다음에

pom.xml에서 수정 -> dependancy는 수정안해도 되는데 이런부분들은 수정해줘야한다.

그리고 pom.xml의 maven -> update project하면 에러안뜨면서 버전을 변경할수잇다.

 

 

 

이것도 이클립스 IDE여서 lombok.jar를 설치해 주어야한다. 

 

sts.ini파일에서 lombok에 관한 게 추가가 되었다면 성공

 

 

 

println에 관한건 다 실행시간이 많이 걸린다. 개발시에 주석문 출력해 놓은 것을 다 삭제하기 어렵다 이때 log4j.jar파일을 

 

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${org.slf4j-version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.15</version>

 

<param name="ConversionPattern" value="%-5p: %c - %m%n" />

 

 

%p는 로그 레벨 이름 출력

-p는 왼쪽정렬

%m 로그 메세지 출력

%n -> 줄바꿈이네

%c->패키지명

 

레벨 설명
FATAL 애플리케이션 작동불가시 로그작성
ERROR 실행중 문제발생시 로그작성
WARN 향후 시스템오류가능성 로그작성
INFO 운영정보 메시지 로그작성
DEBUG 디버깅 용도 로그작성
TRACE 상세한 로깅 정보를 출력하기 위한 로그 작성 ->실행 경로 다볼수 있음

 

 

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

 

이걸 쓰는건  @Slf4j로 쓰는거랑 같음 그러면 log.함수명()이렇게 사용가능!

 

log4j.xml파일에 작성되어있는 로그 레벨에 따라 로그가 출력이 된다.

DailyRollingFileAppender클래스에 따라 로그 정보가 지정한 폴더 위치에 작성된다. 반드시 root 로거 태그에도 추가해주어야한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders --><!-- 출력대상 -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	<!-- DailyFile Appenders -->
	<appender name="dailyFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="C:\\spring\\logs\\output.log" />
		<param name="Append" value="true" />
		<layout class="org.apache.log4j.PatternLayout">
		  <param name="DatePattern"   value="'.'yyyy-MM-dd"/>
			<param name="ConversionPattern"   value="[%d{HH:mm:ss}][%-5p](%F:%L)-%m%n"/>
		</layout>
	</appender>

	
	<!-- Application Loggers -->
	<logger name="com.myspring.pro27">
		<level value="debug" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
		<appender-ref ref="dailyFileAppender" />
	</root>
	
</log4j:configuration>

 

 

 

 

 

 

 

 

 

 

 

타일즈를 통해서 include처럼 사용가능

상단 본문 footer 로 분리해서 사용한다 

 -> 이는 라이브러리를 다운받아 사용가능하다

 pom.xml에 서

 

 

src/main/resource밑에 tiles 폴더 생성 그안에 tiles.xml파일을 통해서 side, header,footer등등에 들어갈 jsp파일을 설정해준다. 

 

tiles를 설정하면 기존의 viewResolver가 필요가 없어진다 그 태그를 삭제하고 새로운 태그에 tiles과 viewResolver를 넣는다.

<beans:value>classpath:tiles/*.xml</beans:value>

tiles/아래 .xml파일을 모두 읽어옴

 <beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <beans:property name="definitions">
        <beans:list>
            <beans:value>classpath:tiles/*.xml</beans:value>
        </beans:list>
    </beans:property>
    <beans:property name="preparerFactoryClass"
                  value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" />
</beans:bean>
<beans:bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</beans:bean>

 

tiles_member.xml 파일에는 header,footer, side를 작성하고 main페이지를 태그를 통해서 구성해준다;;; 그리고 jsp페이지에 <titles:insertAttribute name="title"/>를 통해서 넣어준다.

tiles_member.xml

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

<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">


<tiles-definitions>
	<definition name="baseLayout" template="/WEB-INF/views/common/layout.jsp">
		<put-attribute name="title" value=""/>
		<put-attribute name="header" value="/WEB-INF/views/common/header.jsp"/>
		<put-attribute name="side" value="/WEB-INF/views/common/side.jsp"/>
		<put-attribute name="body" value=""/>
		<put-attribute name="footer" value="/WEB-INF/views/common/footer.jsp"/>
		<put-attribute name="title" value=""/>
	</definition>
	<!-- 부모를 상속받아 사용한다. -->
	<definition name="main" extends="baseLayout">
		<put-attribute name="title" value="메인페이지"/>
		<put-attribute name="body" value="/WEB-INF/views/main.jsp"/>
	</definition>
	<definition name="listMembers" extends="baseLayout">
		<put-attribute name="title" value="회원리스트"/>
		<put-attribute name="body" value="/WEB-INF/views/member/listMembers.jsp"/>
	</definition>
	<definition name="loginForm" extends="baseLayout">
		<put-attribute name="title" value="로그인페이지"/>
		<put-attribute name="body" value="/WEB-INF/views/member/loginForm.jsp"/>
	</definition>
	<definition name="memberForm" extends="baseLayout">
		<put-attribute name="title" value="로그인페이지"/>
		<put-attribute name="body" value="/WEB-INF/views/member/memberForm.jsp"/>
	</definition>




</tiles-definitions>

layout.jsp

definition태그에 등록해준 name값에 따라 jsp를 삽입한다.

 

<body>
	<div id="container">
		<div id="header">
			<tiles:insertAttribute name="header"/>
		</div>
		<div id="sidebar-left">
			<tiles:insertAttribute name="side"/>
		</div>
		<div id="contents">
			<tiles:insertAttribute name="body"/>
		</div>
		<div id="footer">
			<tiles:insertAttribute name="footer"/>
		</div>
	</div>
</body>

tiles:insertAttribute를 통해 jsp페이지를 넣는거는 body랑 head의 script부분만 삽입된다. 그래서 jsp 파일에 모든걸 다 넣지 않아도 된다.

 

controller로 부터 매개변수를 받아와서 jsp 페이지를 출력하는법

 

https://baessi.tistory.com/2

 

[Spring] 스프링 tiles 사용하기!

안녕하세요~ 오늘은 스프링 프레임워크에서 tiles 설정을 해보겠습니다~ tiles 란? - 웹 페이지의 상단, 하단, Header, Footer, left 등 반복적으로 사용되는 부분들에 대한 정보를 모아서 관리 - 반복되는

baessi.tistory.com