728x90

 

여느 때처럼 서블릿 생성하기 눌러서 서블릿 클래스를 만들었는데

아래와 같은 에러메세지가 떠서 상당히 당황했다. 클래스를 만들고 나서 뭘 만진 것도 없는데

느닷없이...?

 

 

 

프로젝트 과정에서 파일 합치느라 다른 분의 프로젝트를 받아와서 수정 중이었는데

아마도 이 과정에서 path 지정에 혼선이 있었던 것 같다.

필자의 아래의 방식으로 해결했으니 에러를 고치고 싶다면 한번 시도해볼만 할 것 같다

 

해당 프로젝트 파일 우클릭 - Properties - JavaBuildPath - Libraries

여기서 톰캣(서버)가 잘 있는지 확인하고 있다면 edit이나 add로 서버의 classpath를 다시 한번 각인시켜주자

 

필자는 있어서 edit으로 재지정해줬다

 

 

에러 해결된 모습

 

728x90
반응형
728x90

 

 <servlet> : web.xml에서 해당 클래스를 Servlet으로 등록하는 태그

 <servlet-class>  : 지정 클래스

<url-pattern> : url을 받아와서 연결해주기 위한 장소

<servlet-name> : <servlet>태그의 <servlet-name>과 이름이 같으면 연결 시킨다

 

<servlet>
	<servlet-name>TestServlet1</servlet-name>
	<servlet-class>com.kh.servlet.TestServlet1</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>TestServlet1</servlet-name>
	<url-pattern>/testServlet1.do</url-pattern>
</servlet-mapping>
728x90
반응형

'small steps > 1일 1코딩 - 코딩을 내 몸처럼' 카테고리의 다른 글

[1일1코딩][Java-SQL] 전체 조회 dao  (0) 2022.05.19
[1일1코딩][Java-SQL] 전체 조회 model.vo  (0) 2022.05.18
[1일1코딩]  (0) 2022.05.15
[1일1코딩]  (0) 2022.05.14
[1일1코딩]  (0) 2022.05.13
728x90

 

location.href에서 뷰화면.jsp를 호출하는데 웹페이지가 에러도 안나고 작동도 안하는 경우

인터넷 콘솔창에도 에러가 안뜨고 자바에도 에러 안뜨고,

코드도 다 정확한데 안될 때는 location.href가 소문자인지 확인!!

(필자의 경우 UHD 4k라 글씨가 좀 확 안보일 때가 있어서 l L이 좀 헷갈리긴 한다)

728x90
반응형
728x90

 

Servlet Mapping 방법 2가지

서블릿 매핑 : 서블릿하고 url를 연결

*매핑(mapping) : 하나의 값을 다른 값으로 대응시키는 것

1) web.xml

배포서술자(DD, Deployment Descriptor)

배포서술자의 파일로 web.xml를 사용하는 것

애플리케이션에 대한 전체 설정 정보를 담아두는 파일

여기서 설정이란 인코딩,보안,매핑 설정 등등을 듯함

<welcome-file>

시작 시 실행시키는 파일들을 명명하는 곳

web.xml파일이 실행되면 index.html 파일을 바로 실행하게함

<servlet>

url들어온 이름보고 같은게 있는지 확인하고 거기에 있는 클래스를 실행(<servlet-class>)

<servlet-mapping>

매핑이 url 뭐가 들어왔는지 확인

<url-pattern>

url 주소를 받아오는 곳

<servlet-class>

연결되면 어느 서블릿 클래스를 불러올지 지정하는 곳

 

web.xml 동작 순서

  1. 인터넷 주소창에서 url을 받아옴
  2. <url-pattern>태그에서 해당 url을 받아 저장
  3. <servlet>과 <servlet-mapping>의 <serlvet-name>태그 정보가 같은지 확인
  4. 같다면 <servlet>의 <servlet-class>에 지정된 자바 클래스 파일 실행

 

2) @Annotation

자바에서 Override할 때 사용. 명시로 알려주고, 관련 에러도 잡아줬었음

 


 

Servlet Container

웹서버와 서블릿 사이의 통신을 지원

서블릿 생명주기(life cycle)를 관리

새로운 요청이 들어올 때마다 자바 스레드를 생성해서, 사용자의 요청을 처리

선언적인 방법으로 보안관련 내용을 설정할 수 있다

 

 

 

728x90
반응형
728x90

 

Servlet이란?

웹 서비스를 위한 자바 클래스

javax.servlet.http.HttpServlet클래스를 extends를 통해 인터페이스 상속 받아 사용

 

web.xml : 설정, 매핑,연결

index.html : 화면단

java class : extends HttpServlet 기능단

체크박스, 텍스트박스 등 사용자 데이터 받는 html 페이지

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>0_Practice_Servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 위의 welcom-file태그는 시작 시 실행시키는 파일들을 명명하는 곳임 -->
  
 
 <servlet>
 	<servlet-name>pracServlet1_get</servlet-name>
 	<servlet-class>tryto.pracServlet1_get</servlet-class>
 </servlet>
 <servlet-mapping>
 	<servlet-name>pracServlet1_get</servlet-name>
 	<url-pattern>/pracServlet1_get.do</url-pattern>
 </servlet-mapping>
  
  
  
</web-app>

 

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Jumbotron Template for Bootstrap</title>

<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
</head>

<body>
	<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
		<a class="navbar-brand" href="#">Navbar</a>

		<div class="collapse navbar-collapse" id="navbarsExampleDefault">
			<ul class="navbar-nav mr-auto">
				<li class="nav-item active">
					<a class="nav-link" href="#">Home</a>
				</li>
				<li class="nav-item">
					<a class="nav-link" href="#">Link</a>
				</li>
				<li class="nav-item">
					<a class="nav-link disabled" href="#">Disabled</a>
				</li>
				<li class="nav-item dropdown">
					<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
		            <div class="dropdown-menu" aria-labelledby="dropdown01">
		            	<a class="dropdown-item" href="#">Action</a>
		            	<a class="dropdown-item" href="#">Another action</a>
		            	<a class="dropdown-item" href="#">Something else here</a>
		            </div>
				</li>
			</ul>
			<form class="form-inline my-2 my-lg-0">
				<input class="form-control mr-sm-2" type="text" placeholder="Search"
					aria-label="Search">
				<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
			</form>
		</div>
	</nav>
	
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3">Hello, Servlet world!</h1>
			<p>
				서블릿이란, 웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해 웹을 만들기 위해 필요한 기술로
				javax.servlet.http.HttpServle클래스를 상속받는다.<br>
				다시 말해 기존의 java파일에 웹 페이지 구현을 위한 html이 들어간 구조라고 볼 수 있다.<br>
				클라이언트의 요청을 처리하고 그 결과를 HTML을 사용하여 요청에 대한 응답을 다시 클라이언트에 전송하는 구현 규칙이 있다.<br>
				단, HTML변경 시 servlet을 재컴파일 해야한다는 단점이 있다.
				
			</p>
			<p>
				<a class="btn btn-primary btn-lg" href="#" role="button">Learn
					more &raquo;</a>
			</p>
		</div>
	</div>

	<div class="container">
		<!-- Example row of columns -->
		<div class="row">
			<div class="col-md-4">
				<h2>Servlet-1</h2>
				<p>
					<!-- get방식 헤더에 첨부되어 전송됨 -->
					GET방식은 URL에 변수(데이터)를 포함시켜 요청하는 것으로 보안 유지가 불가능하다.
					따라서 로그인 같은 경우 get방식은 부적합하다. GET방식에서 데이터를 header에 포함하여 전송하는데
					Body는 보통 빈 상태로 전송되며 header내용 중 body의 데이터를 설명하는 content-type헤더필드도 듣어가지 않는다.
					header에 데이터가 들어가기 때문에 전송하는 길이에 제한이 있으며 초과 데이터는 절단된다. 캐싱이 가능하다.
										
				</p>
				<p>
					<a class="btn btn-secondary" href="servlet/pracServlet1_get.html" role="button">View
						details &raquo;</a>
				</p>
			</div>
			<div class="col-md-4">
				<h2>Servlet-2</h2>
				<p>
					<!-- post방식 바디에 첨부되어 전송됨 -->
					POST방식은 URL에 변수(데이터)를 노출하지 않고 요청하는 것으로 보안 유지가 가능하다.
					데이터를 Body에 포함하여 전송하므로 Body의 데이터를 설명하는 content-type헤더 필드가 들어가고 어떤 타입인지 명시해줘야 한다.
					body에 데이터가 들어가 전송 길이는 제한이 없지만 최대 요청 받는 시간이 존재해 페이지 요청, 기다리는 시간이 있다.
					URL에 데이터가 노출되지 않아 즐겨찾기나 캐싱이 불가능하다.
										
					
				</p>
				<p>
				    <a class="btn btn-secondary" href="#.html" role="button">View
						details &raquo;</a>
				</p>
			</div>
			<div class="col-md-4">
				<h2>Servlet-3</h2>
				<p>
					서블릿은 화면에 표현될 html코드를 프로그램적으로 작성한다.
					이것으로 생기는 단점은 비즈니스 로직과 화면 구현 디자인이 같이 있어 가독성이 떨어지고 개발이 어렵다.
					이러한 구조는 협업을 중요시 하는 개발자들의 입장에서는 좋지 않은 코드로 비즈니스 로직과 디자인은 분리되는 것이 좋다.
					또한 html파일 수정 시 서버를 재시동해야하고 htm1에는 서버에서 얻어온 정보를 동적으로 반영하기 힘들다.
					
				
				</p>
				<p>
					<a class="btn btn-secondary" href="#" role="button">View
						details &raquo;</a>
				</p>
			</div>
		</div>

		<hr>

	</div>

	<footer class="container">
		<p>&copy; Company 2017-2018</p>
	</footer>
</body>
</html>
728x90
반응형

+ Recent posts