<?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>
<!-- 추가 부분 시작 : HTML 설정 부분 -->
<servlet>
<servlet-name>htmlServlet</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>htmlServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- 추가 부분 끝 : HTML 설정 부분 -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 한글설정 -->
<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>
<!-- 한글설정 END -->
</web-app>
2. servlet-context.html의 suffix를 html로 변경
<beans:propertyname="suffix"value=".jsp" />를
<beans:propertyname="suffix"value=".html" />로 변경
<?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 />
<!-- 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/" />
<!-- jsp을 html로 변경 -->
<beans:property name="suffix" value=".html" />
</beans:bean>
<context:component-scan base-package="com.example.thymeleaf" />
</beans:beans>
2. dispatcher-servlet.xml(이클립스 경우, servlet-context.xml)에 multipart 부분 설정
<!-- 파일업로드 관련 Mulitipart 설정 -->
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--
setting maximum upload size
최대 크기 설정
<beans:property name="maxUploadSize" value="-1"/>
-->
<beans:property name="maxUploadSize" value="209715200"/> <!-- 20MB --> <!-- max size of file in memory (in bytes) -->
<beans:property name="maxInMemorySize" value="1048576"/> <!-- 1MB -->
</beans:bean>
3. web.xml에 multipart 부분 설정
<!-- MultipartFilter 적용 -->
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- MultipartFilter 적용 -->
4. tomcat 설정하기(본인 설치한 톰캣 설정 파일) - 톰캣 - conf - context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context allowCasualMultipartParsing="true">
<!-- Context와 아래 Resource 부분 변경 해결 -->
<Resources cachingAllowed="true" cacheMaxSize="100000"></Resources>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
5. tomcat 설정하기(본인 설치한 톰캣 설정 파일) - 톰캣 - conf - server.xml
for(let j = 0; j < 10; j++){
var arr = [];
console.time("1-1.calculatingTime")
for (var i = 1; i <= 1000000; i++) {
arr[i] = i;
}
console.timeEnd('1-1.calculatingTime');
// -------------------------------------
var arr = [];
console.time("2-1.calculatingTime")
for (var i = 1; i <= 1000000; i++) {
arr.push(i);
}
console.timeEnd('2-1.calculatingTime');
}
1-2. 결과 :
익스의 경우 arr[i] = i가 성능상 빠름,
크롬의 경우 arr[i]가 빠르다고 생각하여 테스트를 진행하였으나,
엎치락뒤치락 하는 기록이 있음 (평균값. arr[i] = i : 20.79489746ms , arr.push(i) : 24.61420898)
2-1. 테스트
var j = 0;
for (j = 0; j < 10; j++) {
var sum = 0;
var arr = [];
console.time("1.calculatingTime")
for (var i = 1; i <= 1000000; i++) {
sum += i;
arr[i] = sum;
}
console.timeEnd('1.calculatingTime');
}
// -------------------------------------
var j = 0;
for (j = 0; j < 10; j++) {
var sum = 0;
var arr = [];
console.time("2.calculatingTime")
for (var i = 1; i <= 1000000; i++) {
sum += i;
arr.push(sum);
}
console.timeEnd('2.calculatingTime');
}
2-2 결과
익스의 경우 여전히 arr[i] = i가 성능상 빠름,
크롬의 경우 엎치락뒤치락 하는 기록이 있음(평균값. arr[i] = i : 75.38521ms , arr.push(i) : 78.85928)
// SimpleMappingController.java
// localhost:8080/SimpleMapping1 으로 페이지 불러오기
@GetMapping("/SimpleMapping1")
public String SimpleMapping1(){
// views/SimpleMapping/SimpleMapping1.jsp 페이지
return "SimpleMapping/SimpleMapping1";
}
1-2. 테스트 코드(SimpleMappingControllerTest.java)
// SimpleMappingControllerTest.java
@Test
public void simpleMapping1() throws Exception{
// 페이지 요청시 성공적으로 처리
mockMvc.perform(get("/SimpleMapping1"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isOk()) // 200
.andExpect(forwardedUrl("SimpleMapping/SimpleMapping1")) //
;
// 페이지 요청시 /123 부분으로 404 에러
mockMvc.perform(get("/SimpleMapping1/123"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isNotFound()) // 404 에러
;
// 페이지 요청시 /zzzzz 부분으로 404 에러가 일어남으로 400번대 에러임을 확인
mockMvc.perform(get("/SimpleMapping1/zzzzzz"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().is4xxClientError()) // 400 번대 에러일 경우
;
}
2. 컨트롤러의 path의 숫자 또는 영문 받기
2-1. 컨트롤러 소스 코드(SimpleMappingController.java)
// SimpleMappingController.java
// localhost:8080/SimpleMapping1 으로 페이지 불러오기
@GetMapping("/SimpleMapping2/{number:[1-9]+}")
public String SimpleMapping2Number(@PathVariable String number){
System.out.println("number = > " + number);
// views/SimpleMapping/SimpleMapping1.jsp 페이지
return "SimpleMapping/SimpleMapping1";
}
// localhost:8080/SimpleMapping1 으로 페이지 불러오기
@GetMapping("/SimpleMapping2/{characters:[a-z]+}")
public String SimpleMapping2String(@PathVariable String characters){
System.out.println("characters = > " + characters);
// views/SimpleMapping/SimpleMapping1.jsp 페이지
return "SimpleMapping/SimpleMapping1";
}
2-2. 테스트 코드(SimpleMappingControllerTest.java)
@Test
public void simpleMapping2() throws Exception{
// 페이지 요청시 number 또는 characters 없음으로 404 에러
mockMvc.perform(get("/SimpleMapping2"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isNotFound()) // 404
;
// 페이지 요청시 number
mockMvc.perform(get("/SimpleMapping2/123123"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isOk()) // 200
.andExpect(forwardedUrl("SimpleMapping/SimpleMapping1")) //
;
// 페이지 요청시 characters
mockMvc.perform(get("/SimpleMapping2/asdasda"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isOk()) // 200
.andExpect(forwardedUrl("SimpleMapping/SimpleMapping1")) //
;
}
3. 컨트롤러의 여러 패스를 받는 경우 / 하나의 패스를 받는 경우
3-1. 컨트롤러 소스 코드(SimpleMappingController.java)
// "SimpleMapping3/"만 맞는 다면, 모든 다 받는다(ex: "test/123" , "test" , "test/1111/1123123")
@GetMapping("/SimpleMapping3/**")
@ResponseBody
public String SimpleMapping3Multi(HttpServletRequest request){
System.out.println("SimpleMapping3Multi");
System.out.println("request.getRequestURI() = > " + request.getRequestURI());
return "SimpleMapping3Multi " + request.getRequestURI();
}
// "SimpleMapping3/" 아래의 한 패스만 받는다, (ex: "test" , "zzzzz" , "1123123")
@GetMapping("/SimpleMapping3/*")
@ResponseBody
public String SimpleMapping3Simple(HttpServletRequest request){
System.out.println("SimpleMapping3Simple");
System.out.println("request.getRequestURI() = > " + request.getRequestURI());
return "SimpleMapping3Simple " + request.getRequestURI();
}
3-2. 테스트 코드(SimpleMappingControllerTest.java)
@Test
public void simpleMapping3() throws Exception{
// 페이지 요청시 number 또는 characters 없음으로 404 에러
mockMvc.perform(get("/SimpleMapping3"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isOk()) // 200
.andExpect(content().string("SimpleMapping3Multi " + "/SimpleMapping3"))
;
// 페이지 요청시 number 또는 characters 없음으로 404 에러
mockMvc.perform(get("/SimpleMapping3/123/zzzzaaa"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isOk()) // 200
.andExpect(content().string("SimpleMapping3Multi " + "/SimpleMapping3/123/zzzzaaa"))
;
// 페이지 요청시 number 또는 characters 없음으로 404 에러
mockMvc.perform(get("/SimpleMapping3/zzaseqwe123"))
.andDo(print()) // 처리 내용을 출력
.andExpect(status().isOk()) // 200
.andExpect(content().string("SimpleMapping3Simple " + "/SimpleMapping3/zzaseqwe123"))
;
}
@Controller public class SimpleMappingController {
// localhost:8080/SimpleMapping1 으로 페이지 불러오기 @GetMapping("/SimpleMapping1") public String SimpleMapping1(){ // views/SimpleMapping/SimpleMapping1.jsp 페이지 return "SimpleMapping/SimpleMapping1"; }
// localhost:8080/SimpleMapping1 으로 페이지 불러오기 @GetMapping("/SimpleMapping2/{number:[1-9]+}") public String SimpleMapping2Number(@PathVariable String number){ System.out.println("number = > " + number); // views/SimpleMapping/SimpleMapping1.jsp 페이지 return "SimpleMapping/SimpleMapping1"; }
// localhost:8080/SimpleMapping1 으로 페이지 불러오기 @GetMapping("/SimpleMapping2/{characters:[a-z]+}") public String SimpleMapping2String(@PathVariable String characters){ System.out.println("characters = > " + characters); // views/SimpleMapping/SimpleMapping1.jsp 페이지 return "SimpleMapping/SimpleMapping1"; }
// "SimpleMapping3/"만 맞는 다면, 모든 다 받는다(ex: "test/123" , "test" , "test/1111/1123123") @GetMapping("/SimpleMapping3/**") @ResponseBody public String SimpleMapping3Multi(HttpServletRequest request){ System.out.println("SimpleMapping3Multi"); System.out.println("request.getRequestURI() = > " + request.getRequestURI()); return "SimpleMapping3Multi " + request.getRequestURI(); }
@Test public void simpleMapping1() throws Exception{ // 페이지 요청시 성공적으로 처리 mockMvc.perform(get("/SimpleMapping1")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isOk()) // 200 .andExpect(forwardedUrl("SimpleMapping/SimpleMapping1")) // ;
// 페이지 요청시 /123 부분으로 404 에러 mockMvc.perform(get("/SimpleMapping1/123")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isNotFound()) // 404 에러 ;
// 페이지 요청시 /zzzzz 부분으로 404 에러가 일어남으로 400번대 에러임을 확인 mockMvc.perform(get("/SimpleMapping1/zzzzzz")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().is4xxClientError()) // 400 번대 에러일 경우 ; }
@Test public void simpleMapping2() throws Exception{ // 페이지 요청시 number 또는 characters 없음으로 404 에러 mockMvc.perform(get("/SimpleMapping2")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isNotFound()) // 404 ;
// 페이지 요청시 number mockMvc.perform(get("/SimpleMapping2/123123")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isOk()) // 200 .andExpect(forwardedUrl("SimpleMapping/SimpleMapping1")) // ;
// 페이지 요청시 characters mockMvc.perform(get("/SimpleMapping2/asdasda")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isOk()) // 200 .andExpect(forwardedUrl("SimpleMapping/SimpleMapping1")) // ; }
@Test public void simpleMapping3() throws Exception{ // 페이지 요청시 number 또는 characters 없음으로 404 에러 mockMvc.perform(get("/SimpleMapping3")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isOk()) // 200 .andExpect(content().string("SimpleMapping3Multi " + "/SimpleMapping3")) ;
// 페이지 요청시 number 또는 characters 없음으로 404 에러 mockMvc.perform(get("/SimpleMapping3/123/zzzzaaa")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isOk()) // 200 .andExpect(content().string("SimpleMapping3Multi " + "/SimpleMapping3/123/zzzzaaa")) ;
// 페이지 요청시 number 또는 characters 없음으로 404 에러 mockMvc.perform(get("/SimpleMapping3/zzaseqwe123")) .andDo(print()) // 처리 내용을 출력 .andExpect(status().isOk()) // 200 .andExpect(content().string("SimpleMapping3Simple " + "/SimpleMapping3/zzaseqwe123")) ; } }