테스트 진행하려는데 에러 발생!!

https://stackoverflow.com/questions/7615645/ssl-handshake-alert-unrecognized-name-error-since-upgrade-to-java-1-7-0

 

SSL handshake alert: unrecognized_name error since upgrade to Java 1.7.0

I upgraded from Java 1.6 to Java 1.7 today. Since then an error occur when I try to establish a connection to my webserver over SSL: javax.net.ssl.SSLProtocolException: handshake alert:

stackoverflow.com

java -Djsse.enableSNIExtension=false yourClass
System.setProperty("jsse.enableSNIExtension", "false");

1.vm 옵션에 넣어 봤는데 안된다.....(도움말>>사용자지정  VM 옵션 편집 선택시 파일이 열림)

2. 환경변수 변경해 봤는데(실행>>구성편집 ) 봣는데도 안되어서 고수님께 문의//////

 

could not resolve common.standard:common-standard-lib:1.20.7-SNAPSHOT.

----------------------------

이부분 gradle문제로 내부 인터넷을 쓰기때문에 인증되지 않아서 발생되는 문제로 파악된다고 하신다....ㅠㅠ

git을 마스터로 하고 있었는데 브런치 만들고 재부팅하면서 인증메세지가 뜨길래 그냥 yes 했더니 먹힌다....ㅠㅠ

어려운 인텔리제이....

이클립스 익히기도 어려웠는데 인텔리제이도 어렵다. 나한테...ㅠㅠ

아참!!!!!!!!!!!!!!

deprecated gradle features were used in this build, making it incompatible with gradle 8.0.

계속 이런 알림을 보내는거예요????

gradle 7.4 버전중에 안되는게 있다 알림인데.....검색해서

줄친거는 같은지 확인하고

빌드 및 실행을 디폴트에서 인텔리제이꺼로 변경하니 안뜸.....

구글에 검색하게 해주신 모든 분들께 감사^^

clone 시간 너무 걸리니깐 단축하기!

5개의 git 파일 clone해야 하는데....너무 일일이 하기 넘 시간부족!

이럴경우 이내용을 그대로 text 파일에 복붙해서 저장한 다음

확장자 txt를 삭제합니다.

삭제하니 성격이 달라집니다.

더블클릭해서 실행킵니다.....

당근 id/ pw 넣고

그럼 폴더에 자료가 다운됩니다.

 

 

글쓰기는 textarea....에서 했는데

불러오기를 하니......줄바꿈이 안되었다.

난 엔터치며 입력했는데 데이터 불러올때는 엔터 안먹힘...이런 황당한일이....

검색하니 br/을 먹게 해라...
 을 넣어라...등등이 있는데

좀더 검색하니...c:out을 통해 할수 있는방법이 있었다...

<참고로 textarea로 입력한걸 div로 불러오면 엔터 반영안된다...table 디자인때문에 div로 바꿘것이 원인.....>

이미 DB에 입력한걸 /n을 변경하는 것보다  jsp에서 그냥 반영하여 출력하는게 훨씬 편한듯하여

그방법으로 수정하니 한방해결!!!!!

<td >
	${view.content }								
</td>

이부분을 이렇게 수정했다..

<td>
    <textarea ><c:out value="${view.content }"/></textarea>								
</td>

참고로 프로젝트상 부트스트랩을 사용하여 textarea에서 스타일이 따로 있기에 cols, rows 생략....

잊지 않으려고 기록!!!

까먹으면 검색하려고 저장~~^^

 

참여했던 board의 Test를 해보고 싶었습니다.

가장 간단하게  글의 id를 부여하여 조회되는지 확인하는 것입니다.

package portal.control.web;  //경로 중요

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import portal.commons.data.Box;
import portal.service.BoardService;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration   //이거 중요
@EnableWebMvc
@ContextConfiguration(locations = "classpath:conf/context-*.xml")
public class AdminBoardTest {

	@Autowired
	private BoardService boardService;
	// 잊지말자 접근제한자ㅜㅜ
	@Autowired
	private WebApplicationContext wac;

	private MockMvc mockMvc;

	@Before // JUINT껄로 임포트
	public void setup() {
		// mockMvc 사용하기 위해 builder와 wac객체를 이용하여 setup!
		this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
	}

	@Test
	public void testGetBoardList() {
		// fail("Not yet implemented"); 없다면 아무것도 검증하지 않으므로 성공임....
	}

	@Test
	public void testGoBoardInfoPop() {
		// fail("Not yet implemented");
		try {
			Box box = new Box();
			box.put("s_board_code", "NOTICE");
			box.put("program_code", "BOARD");
			box.put("action_mode", "modify");
			box.put("id", "64");
			Map view = boardService.getBoardView(box);
	
			assertNotNull(view);
		} catch (Exception e) {
	
		}
	}

	@Test
	public void testGoBoardInfoPopMock() {
		// MockMvc객체로 하는 테스트
		try {
			System.out.println(mockMvc);

			MultiValueMap<String, String> info = new LinkedMultiValueMap<>();

			info.add("s_board_code", "NOTICE");
			info.add("program_code", "BOARD");
			info.add("action_mode", "modify");
			info.add("id", "64");

			mockMvc.perform(get("mg/board/goBoardInfoPop.do") // 1, 2 perform 어떤 메소드,,, 어떤 url인가를 지정하는 것
					.params(info)) // 3
					.andDo(print())  //andDo 결과확인을 위해...print 콘솔에 출력
					.andExpect(status().isOk()).andReturn(); // 4 성공 할꺼를 예상하고 결과값중에 출력란것..

			assertTrue(true);

		} catch (Exception e) {

		}
	}

	@Test
	public void testGoBoardAction() {

		// fail("Not yet implemented");
	}

}

1. 패키지 경로 중요합니다. 그냥 대충 상위폴더에 만들고 진행했더니 에러 발생했습니다. 감싼 패키지name을 맞추고 진행했더니 되었습니다.

2 Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext  
//이 익셉션은 JVM이 내부의 클래스 정의 데이터 구조(class definition data structure)에서 Class를 찾지 못했다는 것을 나타낸다

Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
//이 익셉션은 Classpath에 로드하고자 하는 Class가 발견되지 않았을 때 발생한다. 보통은 빌드에 문제가 있는 경우로 clean이나 Class파일 삭제 후 재빌드를 수행하여 해결한다

이런에러가 발생했습니다....

servlet과 관련된 에러들이 계속 발생했다..... 프로젝트 업데이트를 해도 발생했는데 ....

어찌저지....Modulepath에 JRE만 남겨놓고 나머지는  Classpath쪽으로 이동시키니깐 저 에러는 해결되었음...

https://whitekeyboard.tistory.com/849

 

더보기

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.test.context.web.WebDelegatingSmartContextLoader]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:224)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:146)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:176)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.resolveContextLoader(AbstractTestContextBootstrapper.java:455)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:346)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:291)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:107)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:137)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:122)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:142)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28)
at org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:513)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext  
//이 익셉션은 JVM이 내부의 클래스 정의 데이터 구조(class definition data structure)에서 Class를 찾지 못했다는 것을 나타낸다

at org.springframework.test.context.web.WebDelegatingSmartContextLoader.<init>(WebDelegatingSmartContextLoader.java:63)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211)
... 29 more

Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
//이 익셉션은 Classpath에 로드하고자 하는 Class가 발견되지 않았을 때 발생한다. 보통은 빌드에 문제가 있는 경우로 clean이나 Class파일 삭제 후 재빌드를 수행하여 해결한다

at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 36 more

참고로 @WebAppConfiguration 넣으니 해결되었습니다.....^^

//그냥 여담인데...제가 이클립스 다운 받을때 잘못받았는지 source가 안보였습니다..... 이클립스 다운받을때 경량한거 안받기!!!!^^

더불어 남이한거 그냥 복붙해서 연습했더니 머리속에서 삭제된 것이 있었습니다. 바로 private관련.....

처음엔...@Autowired BoardService bService;  을 그냥 붙여서 넣었습니다...

그런데 우리는 이러면 되요 안되요....이러면 그냥 디폴트가 되잖아요??? 안되는거잖아요...

private//public //default//protected ///접근제한자 잊지말자!!!그중 기본은 private이다~~~~~

 

이렇게 해서 일단 BOX 형태로 값을 주어서 하는 방식은 금방 해결되었는데

2번째  

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

방식은 좀 어려웠습니다..

사실 스프링부트에서는 @ AutoConfigureMockMvc 걸면 자동으로 해결해주는데

지금 프로젝트는 부트가 아니라서 직접 pom 설정을 해야합니다.

이 2번째에서 계속

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /mg/board/goBoardInfoPop.do
       Parameters = {s_board_code=[NOTICE], program_code=[BOARD], action_mode=[modify], id=[64]}
          Headers = []
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 404
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

더보기

13:43:41.637 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - GET "/mg/board/goBoardInfoPop.do", parameters={masked}
13:43:41.638 [main] WARN org.springframework.web.servlet.PageNotFound - No mapping for GET /mg/board/goBoardInfoPop.do

java.lang.AssertionError: Status expected:<200> but was:<404>

1. DI설정...이건 pom이 없어서 잘모르겠으나  여러 xml파일통해서 문제가 없어보이고 앞선 test가 문제없어 패스

2. junit 설정...고쳐봤으나 해결안됨 

3. import....이클립스도 없다는걸 내가 발견할수 없어서 패스...

4. 매핑 주소.......문제.....일단 에러 검색시의 답도 그렇고 콘솔의 메세지도 그렇고 이쪽으로 기웁니다...

잠시 쉬었다가 고수님께 질문해서 답을 찾아야 할것 같습니다..ㅠㅠ

 

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Junit Test builder()  (0) 2023.02.22
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16
JUNIT TEST 하기  (0) 2022.11.09

사실 잘 이해 가지 않는 부분인데...일단은 정리 해놓고 다음에 다시 또 보려고 합니다.

이걸 공부하게 된 계기는

제가 메인//// 메뉴////본문////이렇게 3부분의 jsp파일로 화면 구성을 했고

그중 메인에만  js파일을 넣어서 스크립트를 꾸렸더니

문제는 어쩌다 본문한개를 콜백으로 화면 변경하여 데이터를 불러 왔더니 js가 안먹히는 겁니다.

아무것도.....그 어떤것도.......왜그런줄 몰랐는데 초고수님 말씀!!!

자바스크립트는 순차적으로 로딩~~~메인의 자바스크립트는 이미 불러왔는데 이후 불러온 본문jsp파일을 읽고 처리할 스크립트 적용 처리 없이 그냥 불러오니 이미 적용된 메인의 js가 안먹힌다......였어요..

 

그래서 메인의 js파일에서 본문의 b.jsp파일을 함수로 불러오면 먹히겠금 구성하였는데

그럼 파일을 다시 불러올때 불필요한 가비지 데이터가 생긴다.......... 사실 이부분도 어렵습니다...일단 기록!

이걸 해결하는 것이 클로저!

클로저란 ? 내부 함수가 정의 될 때 외부 함수의 환경을 기억하고 있는 내부함수를 말함/ 외부 함숴 안에서 선언된 내부 함수는 그 외부 함수의 지역 변수나 함수에 접근하여 사용할 수 있음.

 

클로저 함수의 기본 형태.

//외부 함수
function closuer(){	      
    var count = 0;           //변수 정의
    
    function inner(){       // 내부 함수(클로저)선언
    	return count++;
    }    
    return inner();         // 내부 함수 반환
}

//익명 함수를 이용하는 방법
function closure(){
	var count = 0;
    return function(){      //익명 함수(클로저) 반환
    	return count++;
    }
}

클로저 함수 호출 예시

function outter(){   	//외부 함수
	var data = 1;
    function inner(){	//내부 함수
    	return data;
    }
    return inner();
}

var fucnt = outter();
console.log(func)

값은 1이다.

원래는 outter 함수를 호출하지 않았기 때문에 지역변수 data는 사용하지 못하는 것이 일반적이지만  자바스크립트에서는 사용할수 있다는 것이 특이한 점이다.

또한 전역 변수를 대체하여 클로저를 사용할 수 있어서 전역 변수의 남용을 막을 수 있고 변수 값을 은닉하는 용도로도 사용 할 수 있다.

 

어휘적 환경(Lexical Environment)

function makeAddr(x){
	return function(y){
    	retrun x+Y;
    }
}
const add3 = makeAdder(3);  //x = 3
console.log(add3(2));		//5 ;; y = 2  add함수가 생성된 이후에도
									상위함수인 makeAdder의 x에 접근(기억)
                                    
const add10 = makeAdderA(10);	//x = 10
console.log(add10(5));			//15
console.log(add3(1));			//4

add10과 add3은 다른 환경의 함수임으로 결국 결국 두 함수의 x 의 값은 다르다.

하지만 x의 값을 값자기 100이나 99 변경할수는 없다....add함수의 증감만 있을 뿐....이것을 은닉화!... 인것 같다^^

 

 

https://link.coupang.com/a/MtaVw

 

홈플래닛 고급형 알루미늄 노트북 거치대(쿨링홀 + 높이 각도 조절)

COUPANG

www.coupang.com

 

검색은 확실히 정신을 바~앗짝 ! 차리고 해야한다.....안드로메다로 가출하는 정신을 데리고 오느라 너무 힘들다...

1. 검색어 빈칸에 enter만 치면 메세지 없이 그냥 메인 가는거 정상 수정하기

2. 체크박스 값이 여러개 조건에 맞춰서 검색하기

3. 체크박스 없이 검색에 맞게만 또 조회하기...

4. select 옵션에 맞게 또 검색하기......

 

여긴 if문의 전쟁이다.........

검색의 검색...확인의 확인을 거쳐 탄생한~~~~~

<div class="form-body">
<div class="form-group">
        <div class="col-md-11 border-left-0">
            <div class="row">						
                <div class="d-inline-block custom-control custom-checkbox col-md-2">
                    <input type="checkbox" class="form-check-input"
                        name="colorCheck1" id="check11" value="t1"> <label
                        for="check11">답변대기중</label>				
                </div>

                <div class="d-inline-block custom-control custom-checkbox col-md-2 ">
                    <input type="checkbox" class="form-check-input"
                        name="colorCheck1" id="check12" value="t2"> <label
                        for="check12">처리완료</label>
                </div>
                <div class="d-inline-block custom-control custom-checkbox col-md-2 ">
                    <input type="checkbox" class="form-check-input"
                        name="colorCheck1" id="check13" value="t3"> <label
                        for="check13">게시중지</label>
                </div>
            </div>
        </div>
    </div>				
    <div class="form-group last">
        <div class="col-md-12 border-left-0">
            <div class="row">
                <div class="col-md-3">
                    <select id="projectinput2" name="interested3"
                        class="form-control">
                        <option value="none" selected>구분전체</option>
                        <option value="a">제목</option>
                        <option value="b">내용</option>									
                    </select>
                </div>
                <div class="col-md-6">
                    <div class="d-flex align-items-center justify-content-start">
                        <input type="text" id="userinput2" class="form-control"
                            placeholder="검색어를 입력해주세요." name="">
                        <input type="text" style="display:none;">
                    </div>
                </div>
                <div class="col-md-3">									
                     <button type="button" class="btn btn-primary" onclick="admin_qna_search();">
                                      <i class="fa fa-check-square-o"></i> 검색
                     </button>
                </div>
            </div>
        </div>
    </div>
</div>

앞서서  input 1개일때 검색하면 메인으로 후다닥 가버린다.... form 으로 진행할 때 input이 한개이면 그렇다는 검색 결과!////그냥 hidden으로 input 하나더 만들어 준다.

function admin_qna_search(){
    var qna_checked=$('input:checkbox[name="colorCheck1"]:checked').val();
    var qna_s_option = $("#projectinput2 option:selected").val();
    var qna_search = $('#userinput2').val();
    var url = '';

    if(qna_s_option =='none'){
        $('#userinput2').val('');
        url="mg/board/getBoardList.do?s_board_code=QNA";
    }else if(qna_s_option =='a'){
        url="mg/board/getBoardList.do?s_board_code=QNA&s_subject="+qna_search;		    	
    }else if(qna_s_option =='b'){
        url="mg/board/getBoardList.do?s_board_code=QNA&s_content="+qna_search;
    }
    var chkArr=[];
    $('input:checkbox[name="colorCheck1"]:checked').each(function(){
        var chk=$(this).val();
        chkArr.push(chk);
    })

    if((chkArr.indexOf('t2') > -1) && (chkArr.indexOf('t3') > -1)){ 
        url +="&s_reply_yn=Y&s_use_yn=N";

    }else if((chkArr.indexOf('t2') > -1) && (chkArr.indexOf('t3') < 0)){
        url +="&s_reply_yn=Y&s_use_yn=Y";

    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') > -1) && (chkArr.indexOf('t3') > -1)){

        url +="&s_reply_yn=N&s_use_yn=N";
    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') > -1) && (chkArr.indexOf('t3') < 0)){  
        url +="&s_reply_yn=N&s_use_yn=Y";

    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') < 0 ) && (chkArr.indexOf('t3') > -1)){

        url +="&s_use_yn=N";
    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') < 0 )&& (chkArr.indexOf('t3') < 0)){

        url +="&s_use_yn=Y";
    }


    qna_Start(url); 
}

 $('#userinput2').on('keyup',function(key){

        if(key.keyCode==13) {
             var str = $('#userinput2').val();
             if(str==null || str ==""){
                 alert("소분류선택 후 검색어를 입력하세요");
             }else{
                 admin_qna_search();
             }
        }
    });

더 잘 하실 수 있는 분들이 많으시겠지만...오늘의 난 여기가 최선입니다...!! 응원해주세요...^^

 

https://link.coupang.com/a/MtaVw

 

홈플래닛 고급형 알루미늄 노트북 거치대(쿨링홀 + 높이 각도 조절)

COUPANG

www.coupang.com

 

일단...왜그런지 몰라서...다른 에러는 빨간줄도 뜨고 에러창도 뜨고 난리인데 야들은 그러지도 않으니깐 제껴뒀다.

살짝궁 무시하고 넘어가다가.....결국은 tester에 걸렸다.ㅋㅋㅋㅋㅋ

당연한건데 개무시 하고 있었던 것이다...내영혼에...^^

일단 내가 한 작업은 공지사항과 QNA이다.....미친듯이 힘든것 없을것이다....

내가 초보라서 이야기가 다를 뿐^^

난 엔터치면 어디가라고 주문한적이 없는데 지멋대로 막간다.......에러 표시도 없다...못봤나???? 글적.....

아무튼 수정하라고 지시사항이 떨어져서 수정한다....하라면 해야지.....영혼이 "거봐~~~~~~~" 그런다..ㅋㅋㅋ

 

1. 지맘데로 메인가는거

form에 input가 하나인데 submit하면 그런다고 한다......이것의 해결방법은 은근 간단//이유는 알수없어 변경할수 있는 방법보다는 간단한 방법으로 그냥 해결

<input type="text" style="display:none;">

요거 한줄 넣으니깐 간단히 해결////메인으로 안간다...

 

2.새로고침되버린다.

$(document).ready(function () {
   구현코드
  }

이런것도 넣어보고 했는데  ..결론은

<input type="text" id="userinput2" class="form-control"
    placeholder="검색어를 입력해주세요." name=""
    onkeypress="if(event.keyCode=='13'){event.preventDefault();}">

이거였음.......onkeypress="if(event.keyCode=='13'){event.preventDefault();} 한줄 넣으니깐 내가 넣은 코드가 먹힘...^^

아싸 가오리~~~~~~아!!!옛날 사람!!!!ㅠㅠ

공지사항에 첨부파일을 진행하려고 하는데....기존에 배웠던 form으로 한번에 하는게 아니라

먼저 파일을 id화 하고 그 id를 먼저 받은 다음 그다음에 주내용을 공지사항으로 저장 시키는 것이다.

파일 보내는 건 멀티 파일......멀티파일 전송에 대한건 다음에 공부.......^^

<table id="user_data_table" class="table table-striped table-bordered data-custom-button">						
    <tr>
        <td class="col-md-2">제목</td>
        <td class="col-md-10"><input type="text" name="subject"  class="form-control"></td>
    </tr>
    <tr>
        <td>첨부파일</td>
        <td><input type="file"  id="file_in" name="file"></td>
    </tr>

일부만 발최함........ 첨부파일을 저장시 먼저 임시 id를 얻어야 해서 ajax로 진행

 

var formData = new FormData($('form[name=noticeForm]')[0]);
	   formData += $("form[name=noticeForm]").serialize();
		
		$.ajax({
			type : 'post',
			url : 'mg/board/goBoardInfoPop.do',
			enctype : 'multipart/form-data',
			data : formData,
			processData: false,
			contentType:false,
			cache: false,
			timeout: 600000,
			success : function(data){		
				alert('공지사항을 등록하였습니다!');
				Notice_write(data);
			},
			error : function(e){
				alert('파일 등록 실패하였습니다.');
			}
		});   
	}

html form을 대체하는 FormData객체///// jsp본문의 form과는 별개이다.

이걸하면서 몇가지 필요한 함수 더 확인해 본다.

let formData = new FormData(); // 새로운 폼 객체 생성
formData.append('name','hyemin'); // 폼 데이터를 스크립트로 추가
formData.append('item','hi'); // <input name="item" value="hi"> 와 같다.
formData.append('item','hello'); // <input name="item" value="hello">

// 만일 HTML에 미리 form 태그가 있으면 제이쿼리나 자바스크립트로 가져올 수도 있다.
let formData1 = new FormData($("#form Id")); // 제이쿼리인 경우
let formData2 = new FormData(document.getElementById("form Id")); // 자바스크립트로 가져 올 경

formData.append(name, value)
// - form의 name 과 value 를 필드의 추가
// - input의 name 속성과 value 입력값 역할을 한다고 생각 하면 된다.
// 자바스크립트로 직접 form 태그를 생성

 
formData.append(name, blob, fileName)
// - input 의 type 이 'file' 인 경우에 사용
// - fileName은 file의 이름의 해당
 
formData.delete(name)
// - 주어진 name 으로 필드를 제거
 
formData.get(name)
// - 주어진 name 의 해당 하는 필드 value를 반환
 
formData.getAll(name)
// - append 함수로 추가시 name이 중복 가능
// - 따라서 주어진 name 의 해당 하는 필드의 모든 value를 반환
 
formData.has(name)
// - 주어진 name 의 해당하는 필드가 있을 경우 true, 없으면 false를 반환
 
formData.set(name, value)
formData.set(name, blob, fileName)
// - set 함수는 append 함수 처럼 필드를 추가
// - append와 비슷한 set 메소드는 set도 추가를 해주기는 하지만, 기존 key가 있으면 그 key값을 모두 덮어씌워버린다

https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-FormData-%EC%A0%95%EB%A6%AC-fetch-api

 

[JS] 📚 FormData 사용법 & 응용 총정리 (+ fetch 전송하기)

FormData API 보통 서버에 데이터를 전송하기 위해서는 HTML5 의 폼 태그를 사용해 다음과 같이 메뉴를 구성하여 제출 해본 기억들이 있을 것이다. 아이디 비밀번호 성별 남자 여자 응시분야 영어 수

inpa.tistory.com

이분글을 참조하여 정리하였습니다.

이클립스 버전 새로 설치하고 어찌저지 작업 파일 받고 딱하니 일을 하려하니

view의 jsp파일이 안열리고 빨란x 표시만 뜬다....이게 뭐냐냐.....

SSE core task scheduler startup' has encountered a problem 에러...

java.lang.noclassdeffounderror: com/ibm/icu/util/stringtokenizer.....

 

 

https://stackoverflow.com/questions/73817318/sse-core-task-scheduler-startup-problem-in-eclipse

 

SSE core task scheduler startup problem in eclipse

Whenever I'm launching my eclipse IDE with my project workspace, there is one popup window showing some internal error with the task scheduler. I'm attaching the picture of that popup window here. ...

stackoverflow.com

한시간 검색해서 찾아난 귀한 분^^

정말로 버전이 달랐다.....

help -> install new software 가서 버전 업글하니 해결^^

 

 

깃허브 도메인......ip타입 공유기로 도메일 살수 있다.
sonof.iptime.org:8613 도메인은 ip와 매핑되어 있다.
한개의 IP에 여러 프로그램이 연결되어 있어 구분할 수 있는 port번호를 부여

배포 하는 방법///
1. 컴퓨터 필요. (2명 결원으로 한대는 DB server로 쓰고 있다. )
2. 도메인. 공유기로 대체 가능   //1,2번을 aws로 대체 가능하나 1년후 비용이 어마함.
3. was (apache tomcat) 


1. 이클립스 = 에서 war파일을 만들어서 프로젝트 배포 준비
   export-> War file(압축파일.모든 정보가 있다). ->  (webporjet : 프로젝트 이름을 넣으면 그것이 파일명이 된다 ) (destinetion: 저장시킬 폴더 선택) EXport sourece Files 체크하여 저장시킨다......strap(프로젝트명).war 파일이 생긴다.

2. 해당 컴퓨터에 tomcat.apache(8.5버전)의 해당 버전을 다운로드 한다.......이건 새컴이라는 가정. 있으면 패스
   윈도우에서 그냥 톰캣을 실행을 시킬려면 다운받은 톰캣폴더/ conf 폴더/ server.xml/안의 <Connetctor  port ="9898"  protocol="http/1.1"> 부분을 원하는 포트번호로 변경
   톰캣 폴더에서 cmd.exe실행
   dir목록 확인
   .bat 배치파일을 이용해서 ....startup.bat파일을 입력 엔터하면 서버실행된다. 한글은 깨질수 있음. 그러면 localhost:9898 실행하면 된다.
   shutdown.bat은 서버를 닫는것이다.

톰캣의 webapps폴더로 가서 이클립스에서 받은 strap.war파일을 떨거주면된다.  (이파일은 학원 유틸배포에 있다)

192.168.60.8:9898/strap/ db 서버 ip주소에 (ipconfig)직접 입력--이건 사설 대여기라서 밖에서는 연결안됨///밖에서는 공인된 ip인 도메인이 필요하다.

"/"으로 인터넷 확인하는 방법
톰캣의 1. server.xml로 간다.
1. 한줄 추가
위치는 <Host></Host>안에 넣어야 한다.
    <Context path="" docBase="strap" reloadable="false"/> 추가하면된다. 
서버를 실행시키면 톰캣 webapps에 자동으로 프로젝트 폴더가 생긴다.

공인된 IP 도메인과 연결시키는 방법

공유기  특수 기능 ..ddns 설정  //호스트 이름(sonof.iptiom.org) 을 넣으면 ip주소와 연결된다.란 것이다.
포트번호는 고급설정의 nat / 라우터 관리 의 포트로워드 설정을 가면 설정할수 있고.외부포트(9999) 내부포트(9898)로 설정
호스트이름 : 외부포트 설정한다는 것은 외부에서 sonof.iptime.org:9999  로 연결하면 결국 192.168.60.8:9898 로 연결해준다는 것을 설정하는 것이다.
포트번호를 별도 승인해줘야 하는데 방화벽에서  프로토콜 포트번호/ 특정로컬포트 9898을 넣어줘야 한다.
핸드폰에서 똑같이 저장하면 된다.

+ Recent posts