달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Spring에서 세션을 체크할때 보통 interceptor 를 씁니다. 

지정된 URL 패턴일때 세션을 체크하여 로그인 화면으로 리다이렉트를 시켜주도록 구현을 하였다면

일반적인 form submit일때는 잘 동작합니다.

 

하지만 ajax 의 경우에는 다릅니다.

interceptor를 거치긴 하지만 바로 error 콜백함수를 호출하게 됩니다. 리다이렉트 시키지 않고 responseText 부분에 리다이렉트 페이지의 스트링이 오게 됩니다. 이럴때의 처리는 몇가지가 있습니다.

 

1. session 체크 함수

- ajax 로 session 이 살아있는지 체크를 하고 살아있다면 그 다음 ajax 호출을 합니다.

근데 이렇게 개발하는 건 정말 멍청한 짓입니다. 하지마세요.

 

2. Spring Security

 

참고 : http://lng1982.tistory.com/138 (간단한 세팅)

 

참고 : http://linuxism.tistory.com/671 (개념)


인증과 보안관련 프레임워크입니다. 설정과 이해가 까다롭긴 하지만 공부해서 적용하는게 훨씬 득. 개이득.

시큐리티 설정을 하면 인증정보가 Authentication 객체에 담기게 됩니다. 이 객체는 설정에 따라 HttpSession 에 담길 수도, 쿠키나 외부서버(redis 같은) 에 담길 수도 있습니다. 더이상 세션으로만 사용자 정보를 관리하는 것이 아닌 더 높은 수준의 보안설정을 할 수 있습니다.


(2016.01.29 기준 Spring Security 가 제일 나은듯) 


3. Header 세팅

먼저 $.ajax() 호출 시 beforeSend 옵션에 header 정보를 세팅합니다.

beforeSend : function(xmlHttpRequest){

                   xmlHttpRequest.setRequestHeader("AJAX", "true"); // ajax 호출을  header에 기록

}

 

다음으로 interceptor에서 헤더정보를 확인.

String ajaxCall = (String) request.getHeader("AJAX");

 

ajaxCall 파라미터에 세팅한 "true"라는 문자열이 있으면 HttpServletResponse에 다음과 같이 세팅

response.sendError(500); 

이 때 에러값은 int값으로 알맞게 정의하면 됩니다.

 

그리고 $.ajax() 의 error 콜백에 다음과 같이 정의합니다.

error:function(xhr, textStatus, error){

if(xhr.status=="500"){

alert("Login Session Expired");

location.href = "/";

}

}

서버에서 설정한 에러코드값(여기에서는 500)이 맞으면 로그인세션이 없다는 것으로서

index 페이지로 이동시켜주면 됩니다.


'Programing > AJAX' 카테고리의 다른 글

IE만 가진 Jquery Cache 오류  (0) 2016.11.24
Posted by 한설림
|



$("._datePicker").datepicker({

       prevText: '이전 달',

       nextText: '다음 달',

       monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],

       monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],

       dayNames: ['일', '월', '화', '수', '목', '금', '토'],

       dayNamesShort: ['일', '월', '화', '수', '목', '금', '토'],

       dayNamesMin: ['일', '월', '화', '수', '목', '금', '토'],

    // showMonthAfterYear: true,

    yearSuffix: '년',

    showOn: "button",

        buttonImage: "img/calendar.gif",

        buttonImageOnly: true,

        buttonText: "Select date",

    regional        : 'ko',

        autoSize        : true,

        changeMonth    : true,

        changeYear : true ,

        altFormat       : 'yy-mm-dd',

        dateFormat      : 'yy-mm-dd',

        showButtonPanel : true,

        beforeShow: function() {

          setTimeout(function() {

              $("#ui-datepicker-div").before(

                "<iframe id='ui-datepicker-div-bg-iframe' frameborder='0' scrolling='no' style='filter:alpha(opacity=0); position:absolute;"

                  + "left: " + $("#ui-datepicker-div").css("left") + ";"

                  + "top: " + $("#ui-datepicker-div").css("top") + ";"

                  + "width: " + $("#ui-datepicker-div").outerWidth(true) + "px;"

                  + "height: " + $("#ui-datepicker-div").outerHeight(true) + "px;'></iframe>");

          }, 20);

        },

        onSelect  : function(  dateText, inst ) {

          $(this).removeClass('placeholdersjs');

        },

        onClose: function() {

            clearPlaceholder();

          $("#ui-datepicker-div-bg-iframe").remove();

        }

    });



<input class="_datePicker " id="searchDate" name="searchDate" placeholder="Date" >

'Programing > JQUERY' 카테고리의 다른 글

SCRIPT 에서 APPEND 한 이벤트 Binding 처리  (0) 2020.03.12
특정 영역(DIV) 여닫기 기능 Toggle  (0) 2017.11.23
Posted by 한설림
|

File

하드디스크 정보를 얻을 수 있다.

 

 

함수

listRoots() : 파일 시스템 루트의 리스트를 반환한다. (C:\, D:\ ......)

getTotalSpace() : 하드디스크 총 용량

getUsableSpace() : 하드디스크 사용 공간

getFreeSpace() : 남은 용량 

     - 남은 용량이 사용 공간과 자꾸 똑같이 나와 그냥 총 용량에서 사용공간을 빼버린 값으로 사용했다..ㅠㅠ

 

 

 

소스코드  

String  drive;

double  totalSize, freeSize, useSize;        

 

File[] roots = File.listRoots();

 

for (File root : roots) {

        

drive = root.getAbsolutePath();

            

totalSize = root.getTotalSpace() / Math.pow(1024, 3);

useSize = root.getUsableSpace() / Math.pow(1024, 3);

freeSize = totalSize - useSize;

 

System.out.println("\n하드 디스크 이름 : " + drive + "\n");

System.out.println("전체 디스크 용량 : " + totalSize + " GB \n");

System.out.println("디스크 사용 용량 : " + freeSize + " GB \n");

System.out.println("디스크 남은 용량 : " + useSize + " GB \n");

}

 

 

결과 

하드 디스크 이름 : C:\

전체 디스크 용량 : 299.99999618530273 GB 

디스크 사용 용량 : 36.1625862121582 GB 

디스크 남은 용량 : 263.83740997314453 GB 

 

하드 디스크 이름 : D:\

전체 디스크 용량 : 165.66210556030273 GB 

디스크 사용 용량 : 2.611347198486328 GB 

디스크 남은 용량 : 163.0507583618164 GB 

 

하드 디스크 이름 : E:\

전체 디스크 용량 : 0.0 GB 

디스크 사용 용량 : 0.0 GB 

디스크 남은 용량 : 0.0 GB 

 

하드 디스크 이름 : F:\

전체 디스크 용량 : 0.0 GB 

디스크 사용 용량 : 0.0 GB 

디스크 남은 용량 : 0.0 GB 


Posted by 한설림
|

개발자라면 git을 이용하든, 이용하지않은 얘기는 여기저기서 참 많이 들을것이다.

깃헙에 소스를 올려두라는둥 오픈소스에 참여하라면 깃헙을 가라는 둥... 사용법도 어렵지않다고하는데 쌩초보입장에서는 쉽지않은게 사실이다. 형상관리는 넘어가고 초간단 깃헙 사용법에 대해 포스팅을 하고자한다.


먼저 깃을 설치하자.

https://git-scm.com/book/ko/v1/시작하기-Git-설치

한글로 자세히 설명되어있다.


설치를 마쳤으면 terminal 혹은 cmd 창을 열어 깃이 설치됐는지 확인하자. 버전을 확인하는 커맨드명령어는 다음과 같다.


git --version


숫자로 이루어진 버전이 뜨면 정상적으로 설치된것이다.


형상관리를 해주는 기술의 이름이 git이고 깃을 이용해 서비스를 해주는 업체가 github다. 기본적으로 공개된 저장소에 대해서는 무료로 저장소를 제공하고있고 너무나도 유명하기때문에 많이들 사용한다. 심지어 회사에서도 따로 형상관리 서버를 구축하는것이 아니라 그냥 깃헙을 사용하는 경우가 많다. 깃을 설치했으면 깃헙도 이용해보자.


https://github.com

먼저 깃헙 홈페이지에 접속한 후 sign up 버튼을 눌러 회원가입을 진행하자.

회원가입을 진행하게되면 인증 이메일이 날아오니 인증을 해주면 된다.


자 이제 깃을 설치했고 깃헙 회원이 됐으니 준비는 다 끝났다. 이제 본격적으로 시작해보자.



로그인을 한 후 우측 상단에 보면 +버튼이 있다. 클릭한 후 new repository 를 클릭하자.


repository에 원하는 주소를 적고 아래 create 버튼을 클릭하자.

public 계정은 무료제공이지만 private 계정은 유료다. 중간 readme 체크박스는 README.md 파일을 처음부터 만들지 말지를 선택하는건데 깃헙에 익숙해지면 크게 신경쓸필요 없어지지만 초기엔 체크하는게 설정에 좀더 편함이 있다. 우리는 궂은 길을 가기위해 체크하지않고 넘어간다.


create 버튼을 누르면 저장소가 생성된것이다. 이게 끝이다. 그 이후에 영어로 뭔가 막 써져있는걸 볼수있는데 영어라고 겁먹고 그냥 끄지말고... 어려운 부분은 없다. 정말 친절하다.

제일 위에 new repository on the command line 만 따라하면 된다.



terminal이나 cmd를 다시 열어 깃헙으로 관리하고자하는 디렉토리로 이동하자.

해당 디렉토리를 깃으로 관리하기위해 깃 초기화를 해줘야한다. 다음 명령어를 입력하자


git init


깃 초기화를 했으면 이후 해당 디렉토리를 포함한 하위 디렉토리는 깃의 관리하에 들어가게되고 로컬저장소가 된다. 이제 이 로컬저장소와 방금 깃헙에서 생성한 원격저장소를 연결해야한다. 테스트용으로 원격저장소에 올릴파일을 생성하자. 기존에 해당 디렉토리에 파일이 존재한다면 그 파일을 이용해도 된다.


파일을 생성했으면(혹은 기존파일이 존재하면) 다음 명령어를 입력해보자.


git status


깃은 파일을 세가지 상태로 관리하는데 변경되지않은 파일, 변경(추가)된 파일, 커밋할 파일 로 관리한다.

아직 커밋을 한번도 한적이 없으니 어떤 파일이 존재하든 변경된파일 상태일것이다. 해당 파일을 커밋할 파일 상태로 만들어야한다.

위 스샷에있는 샘플코드는 README.md 파일을 추가하고있는데 이런식으로 파일을 추가해주면 된다.


git add README.md


README.md 외에 다른 파일을 올릴거면 파일명만 변경해서 올려주면 된다.


다시 git status 를 입력해주면 파일이 stage에 올라왔다고 할것이다. 해당 상태가 커밋할 파일상태이다.

이제 커밋을 해주자


git commit -m "commit"


""는 커밋메세지이며 자유롭게 작성하면된다.

이제 로컬저장소내에 파일이 커밋된것이며 원격저장소와는 연결되어있지않으므로 협업하는 동료는 해당 파일의 변화를 알수가없다.(물론 원격저장소와 연결되어있다 하더라도 커밋만으로는 아무것도 모른다.)

깃에서 커밋은 로컬저장소에 저장한다는 의미이므로 내 로컬에서만 변화하는 것이다.


이제 원격 저장소에 연결하자. 깃헙에서 새로운 저장소를 생성했을때 생기는 .git 주소가 있을것이다. 해당 주소를 복사해오고 다시 커맨드창으로 오자.


git remote add origin [url]


원격저장소를 추가하는 명령어이다. origin은 원격저장소의 alias 라고 보면 된다. 굳이 origin일 필요는 없고 자유롭게 적어주면 되나 대부분 origin을 사용한다.

이 명령어가 실행되면 로컬저장소와 원격저장소가 연결된것이며 원격저장소는 꼭 1개일 필요는 없다. 하지만 하나의 로컬저장소를 2개 이상의 원격저장소로 연결해서 사용하는 경우는 한번도 본적이 없다.


원격저장소를 연결했지만 지금도 저장소끼리만 연결했을뿐 실제 로컬에서의 변화를 원격으로 올린적은 없다. 이제 원격저장소에 올리는것을 해보자.


git push -u origin master


push가 원격 저장소로 로컬의 커밋을 올리는 명령어이며 origin은 위에서 설명한 alias다. 어떤 원격에 올릴지를 적는것이다. 위에서 origin이 아닌 다른 명칭을 사용했다면 다른 명칭을 적어주면 된다.


master는 브랜치명을 뜻하며 origin 원격에 있는 master 브랜치에 로컬 커밋을 푸시하겠다는 뜻이다.

브랜치는 다음에 설명하겠다.


이렇게되면 이제 원격저장소에 내 로컬에서의 커밋이 푸시가 됐고 동일저장소를 사용하는 다른 동료들도 이 변화를 알수있게된다.


글로 설명을 덧붙이고 중간중간 status 같은 명령어를 쳐서그렇지 사실 여태껏 한걸 요약하면 저~ 위에 repository를 처음 생성했을때 깃헙 홈페이지에 나온 new repository on the command line에 나온걸 순차적으로 했을뿐이다.

이제 해당 페이지를 새로고침해보자.

처음 생성했을때의 설명이 사라지고 내가 푸시한것이 올라와있는걸 확인할 수 있다.


만약 README.md 파일을 추가했다면 해당 마크다운 파일이 출력되는것까지 볼 수 있을것이다.

계속 변경하고 커밋, 푸시를 해보도록하자.


아까 원격 저장소를 생성할때 README.md 파일을 자동으로 추가해주는 체크박스에 '좀 더 궂은길을 가기위해' 체크하지말고 넘어가자고했다. 해당 체크박스를 선택하고 진행할 경우 README.md 파일이 생성된 상태로 시작하게되며 이상태에서 README.md 파일이 존재하는 디렉토리를 로컬저장소에 다운받은 후 진행할수도있다. 이런경우엔 이미 깃으로 관리하고있는 디렉토리를 다운받게되는것이기때문에 git init과 같은 작업을 해줄필요가없다.

훨씬 편한거 아닌가 라고 생각할수도있는데 위에서 말했듯 해당작업이 그리 어려운부분이 없기에 몇번 하다보면 사실 무의미하다.

'Programing' 카테고리의 다른 글

[MyBatis] Parameter NULL 처리방법  (1) 2020.06.22
Posted by 한설림
|


request.getContextPath(); 
request.getRequestURI(); 
request.getHeader("REFERER"); 
request.getRealPath("/")


request.getContextPath()는 프로젝트의 Context path명을 반환한다.

요청 : http://localhost:8080/example/test.jsp 

리턴값 : /example




request.getRequestURI()는 웹전체 경로(프로젝트명+ 파일 경로)까지 반환한다.

요청 : http://localhost:8080/example/test.jsp

리턴값 : /example/test.jsp 




request.getHeader("REFERER")는 요청을 한 부모요청의 URL주소를 반환한다.

현재 페이지:  http://localhost:8080/example/test1.do

요청 페이지 :  http://localhost:8080/example/test.do

리턴값 : http://localhost:8080/example/test.do




request.getRealPath("/")는 서버 또는 로컬의 웹애플리케애션 서버의 docBase 설정값을 반환한다.

요청 : http://localhost:8080/example/test.jsp

리턴값 : D:\Project\webapps\example\


Posted by 한설림
|
public class StringFinder {
    public static void main(String[] args) {

        String txt1 = "가나다라" ;
        String txt2 = "해당 내용은 테스트 입니다" ;
        String txt3 = "가격은 29,000원 입니다" ;

        // contains를 이용한 방법(true, false 반환)
        if(txt1.contains("나다"))
            System.out.println("문자열 있음!");
        else
            System.out.println("문자열 없음!");
         
         
        // indexOf를 이용한 방법
        if(txt2.indexOf("테스트") > -1)
            System.out.println("문자열 있음!");
        else
            System.out.println("문자열 없음!");
         
         
        // matches를 이용한 방법
        if(txt2.matches(".*테스트.*"))
            System.out.println("문자열 있음!");
        else
            System.out.println("문자열 없음!");
         
         
        // matches를 이용하여 정규 표현식으로 문자열에 숫자가 있는지 확인
        if(txt3.matches(".*[0-9].*"))
            System.out.println("숫자 있음!");
        else
            System.out.println("숫자 없음!");
    }
}

contains : 문자열에 검색하고자 하는 문자가 있는지 확인 : 포함 - true / 미포함 - false
indexOf 문자열에서 검색하는 문자의 위치를 반환 : 포함 - 문자 위치 / 미포함 - -1 )
matches 정규식을 이용하여 문자열을 검색한다, 특정 문자열을 검색할때 사용하기 보다는 한글, 숫자 등과 같이 해당 형태의 텍스트가 존재하는지 확인할때 사용하면 좋다 : 포함 - true / 미포함 - false

출처 : http://fruitdev.tistory.com/72


Posted by 한설림
|




DispatcherServlet : 클라이언트의 요청을 전달받음. 컨트롤러에게 클라이언트의 요청을 전달하고 컨트롤러가 리턴한 결과 값을 view에 전달하여 알맞은 응답을 생성하도록 한다.


HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할 지를 결정

 - SimpleUrlHandlerMapping

 - BeanNameUrlHandlerMapping

 - ControllerClassNameHandlerMapping

 - DefaultAnnotationHandlerMapping


Controller : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려줌.

 - Controller

 - AbstractController

 - AbstractCommandController

 - SimpleFormController

 - AbstractWizardFormController

 - ParameterizableViewController

 - UrlFilenameViewController

 - MultiActionController


ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.


ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정


View : 컨트롤러의 처리 결과 화면을 생성

Posted by 한설림
|

시스템 사용자께서 데이터 저장이 안된다는 문의를 받았다.

응? 그럴리가 크롬에서 확인하니깐 잘된다...

어라? IE에서 확인하니깐 안된다??  어라??


F12 누르고 개발자 모드로 보니깐 .... 

HttpRequest 결과가 304로?????  뭐지??? 

이미 서버의 메모리에 있던 값을 클라이언트에게 계속 던져주고 있다. 

200이 뜨란 말이야!! 새로 받아오라고!!




IE의 경우 ajax로 호출하는 URL이 동일하고 파라미터가 없거나 할 경우 매번 URL을 호출하는것이 아닌 Cache를 이용하여 지가 멋대로 결과값을 내보내 주고 있었다. (서버에 요청을 안한다...)


jquery 옵션을 찾아보니 cache 항목이 보인다. 해당 옵션은 default로 true로 설정되어 있는데, 해당 옵션을 false로 변경하면 IE에서 해당 오류가 사라진다.


"cache:false"를 ajaxSetup에 추가하거나 ajax 구문에 직접 넣으면 된다.


1
$.ajaxSetup({cache:false});


1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({
      
    type : "GET",
    url : "test.jsp",
    dataType : "json",
    cache : false,
    error : function(){
    },
    success : function(json){
    }
      
});


Posted by 한설림
|

WEB-INF/Web.xml 파일에서 발생하는 에러에 대한 설정이 아래와 같이 가능하다


<error-page>

        <exception-type>com.lgcns.ncd.common.exception.AuthException</exception-type>

        <location>/WEB-INF/jsp/system/error/errorAuth.jsp</location>

    </error-page>


    <error-page>

        <error-code>404</error-code>

        <location>/WEB-INF/jsp/common/error/error404.jsp</location>

    </error-page>

    <error-page>

        <error-code>500</error-code>

        <location>/WEB-INF/jsp/common/error/error500.jsp</location>

    </error-page>


근데???? 크롬에서는 잘된다... 에러페이지 불러오기가


error404.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>404 에러페이지 </title>

<script type="text/javascript">

alert('화면을 찾을 수 없습니다. \n이전 화면으로 돌아갑니다.');

history.back();

</script>

</head>

<body>


</body>

</html>


근데 익스플로러에서는 alert 메시지도 안나오고 이전화면으로도 돌아가지도 않고

익스플로러 전용의 404 화면을 보여준다...

뭐지 싶어서 찾아본 결과로는 

브라우저 마다  response. 코드 해석이 달라서 그렇다고 한다.

익스플로러에서도 내가 지정한 에러페이지에 대한 접근이 가능하게 하려면

보고 싶은 에러지정 페이지에

<%

response.setStatus(200);

%>

를 넣어주면 끝! 



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%

response.setStatus(200);

%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>404 에러페이지</title>

<script type="text/javascript">

alert('화면을 찾을 수 없습니다. \n이전 화면으로 돌아갑니다.');

history.back();

</script>

</head>

<body>


</body>

</html>


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%

response.setStatus(200);

%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>500 오류 페이지</title>

<script type="text/javascript">

alert('오류가 발생하였습니다. \n서비스 오류가 발생했습니다. 시스템 담당자에게 문의해 주세요.');

history.back();

</script>

</head>

<body>


</body>

</html>


Posted by 한설림
|

text-transform 속성은 영어 대문자와 소문자를 서로 전환시킬 수 있는 속성입니다. 한글에는 쓰일 일이 없겠지만 영문에서는 종종 사용됩니다. 문장 전체를 소문자나 대문자로 바꾸는 방법과 단락의 첫 글자만 대문자를 바꿀 수도 있습니다. 그럼 샘플을 통해 어떻게 적용되는지 알아 보도록 하겠습니다.

 

▼ text-transform 속성에 값은 4가지가 있습니다. 영어 단어가 의미하는 대로 소문자와 대문자로 변경하는 속성값과 단어에서 첫 글자만 변경하는 capitalize 값이 있습니다.

 

l  none : 기본값이며 원본 그대로 유지한다.

l  capitalize : 단어의 첫 번째 문자를 대문자로 변경한다.

l  uppercase : 적용한 모든 문자를 대문자로 바꾼다.

l  lowercase : 적용한 모든 문자를 소문자로 바꾼다.

 

▼ 샘플 소스는 4가지 text-transform 속성에 값을 적용한 것입니다. 결과 화면을 보시면 좀더 쉽게 이해가 가실 겁니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE HTML>
<html>
<head>
<meta charset="euc-kr">
<title>CSS</title>
<style type="text/css">
    body {
        background-color: #e7e7e7;
        font-size:14pt;
        width: 500px;
    }
    p { background-color: #d4d4f2;
        border-style: solid;
        border-width: 1px;
        padding: 5px;
    }
    .texttransform1{ text-transform: none; }
    .texttransform2{ text-transform: capitalize; }
    .texttransform3{ text-transform: uppercase; }
    .texttransform4{ text-transform: lowercase; }
</style>
</head>
<body>
    <code>text-transform: none</code>
    <p class="texttransform1">
    The current push to implement labor market</p>
     
    <code>text-transform: capitalize</code>
    <p class="texttransform2">
    The current push to implement labor market</p>
     
    <code>text-transform: uppercase</code>
    <p class="texttransform3">
    The current push to implement labor market</p>
     
    <code>text-transform: lowercase</code>
    <p class="texttransform4">
    The current push to implement labor market</p>
</body>
</html>

Posted by 녹두장군

Posted by 한설림
|