이번 디지털365치과의원 홈페이지를 제작하며 모바일 페이지에 대해 정리합니다.


모바일 페이지 구분을 위해 디바이스를 구분해주는 라이브러리가 있었습니다. 
스프링 모바일 디바이스 입니다. 
순서는 메이븐을 추가해주시고요.
<!-- 모바일 페이지 디바이스 구분 -->
<dependency>
    <groupId>org.springframework.mobile</groupId>
    <artifactId>spring-mobile-device</artifactId>
    <version>1.1.5.RELEASE</version>
</dependency>

web.xml에

<!-- 스프링 모바일 -->

<filter>

  <filter-name>deviceResolverRequestFilter</filter-name>

  <filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>

</filter>

<filter-mapping>

  <filter-name>deviceResolverRequestFilter</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

필터를 추가합니다. 

servlet-context.xml에 이부분을 수정 추가 합니다. 

<!-- 스프링 모바일부분. -->

<annotation-driven>

<argument-resolvers>

<beans:bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />

<beans:bean class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />

</argument-resolvers>

</annotation-driven>

구분

<beans:bean class="org.springframework.mobile.device.view.LiteDeviceDelegatingViewResolver">

  <beans:constructor-arg>

    <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>

  </beans:constructor-arg>

  <beans:property name="mobilePrefix" value="mobile/" />

  <beans:property name="tabletPrefix" value="mobile/" />

  <beans:property name="enableFallback" value="true"/>

</beans:bean>

구분

<interceptors>

   

<beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor"></beans:bean>

<beans:bean class="org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor"></beans:bean>

</interceptors>


이러면 경로가 pc의 경우 views/home.jsp 기존대로 호출되구요. 

모바일이나 태블릿의 경우 view/mobile/home.jsp로 호출됩니다. 중간에 mobile가 붙죠 ^^ 

기존 주소 그대로 호출되고 pc와 모바일이 분리되고 컨트롤러는 같이 쓰고 개발이 편리한것 같습니다. 


블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

스프링부트 2.0 에서  멀티 db를 사용하고 mybaits와 mysql 을 사용해보자.. 

/main/resources/application.properties

파일을 열고 환경 설정을 한다. 

#db순서
spring.first.datasource.type=org.apache.tomcat.jdbc.pool.DataSource 
spring.first.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.first.datasource.jdbc-url=db주소
spring.first.datasource.username=아디
spring.first.datasource.password=패스워드
spring.first.datasource.connectionProperties=useSSL=false;useUnicode=yes;characterEncoding=UTF-8;serverTimezone=UTC 

#db순서
spring.second.datasource.type=org.apache.tomcat.jdbc.pool.DataSource 
spring.second.datasource.driverClassName=com.mysql.jdbc.Driver
spring.second.datasource.jdbc-url=db주소
spring.second.datasource.username=아디.
spring.second.datasource.password=패스워드.
spring.second.datasource.connectionProperties=useSSL=false;useUnicode=yes;characterEncoding=UTF-8;serverTimezone=UTC 

JSP 페이지 사용을 위해서

#JSP를 사용하겠다.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

문자를 UTF-8사용 설정

spring.http.encoding.charset=UTF-8 

첫번째 DB파일 설정

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FirstDataSourceConfig {
@Bean 
@ConfigurationProperties(prefix = "spring.first.datasource") 
public DataSource firstDataSource() 
{
return DataSourceBuilder.create().build(); 

@Bean public SqlSessionFactory firstSqlSessionFactory(DataSource firstDataSource, ApplicationContext applicationContext) throws Exception 
{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 
sqlSessionFactoryBean.setDataSource(firstDataSource); 
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/first/*.xml")); 
return sqlSessionFactoryBean.getObject(); 
}
@Bean public 
SqlSessionTemplate firstSqlSessionTemplate(SqlSessionFactory firstSqlSessionFactory) throws Exception 
{
return new SqlSessionTemplate(firstSqlSessionFactory); 
}

}

 

2번째 DB파일 설정

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SecondDataSourceConfig {
@Bean 
@ConfigurationProperties(prefix = "spring.second.datasource") 
public DataSource secondDataSource() 
{
return DataSourceBuilder.create().build(); 

@Bean public SqlSessionFactory secondSqlSessionFactory(DataSource secondDataSource, ApplicationContext applicationContext) throws Exception 
{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); 
sqlSessionFactoryBean.setDataSource(secondDataSource); 
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/second/*.xml")); 
return sqlSessionFactoryBean.getObject(); 
}
@Bean public 
SqlSessionTemplate secondSqlSessionTemplate(SqlSessionFactory secondSqlSessionFactory) throws Exception 
{
return new SqlSessionTemplate(secondSqlSessionFactory); 
}

}

SQL파일은 여기에 위치한다. 

JSP파일은 여기에 위치한다. 

JSP경로

서비스를 만들고

DAO역시 만들어준다.

컨트롤러 뷰 화면 입니다. 

정리완료... 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

GOOGLE Chrome

SPRING FRAMEWORK 2018. 9. 18. 12:30

웹페이지 인쇄시 인쇄 되는 페이지를 미리보면서 수정할수 있다면 좋을텐데...

보니 크롬에서 지원한다.. @@ 

MORE TOOLS 에서 RENDERING 를 추가 한다. 

EMULATE 를 PRINT 로 설정한다. 

블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

안드로이드 앱에서  스프링 시큐리티(SPRING SECURITY)로 파일 올리기


스프링 세팅을 해주어야 합니다. 

rest로 이미지를 받을때 스프링 시큐리티에서 접근을 허가 안합니다. 웹브라우저로 했을땐 잘되었는데요.

이문제를 모르고 안드로이드 앱이 문제인줄 알았습니다.


rest는 패턴을 지정해주지 않아도 기본적으로 보안 체크를 합니다. 그래서 security-context.xml 파일에 

이값을 추가합니다. 


<http security="none" pattern="/android/**"/>



저는 ANDROID로 파일을 받을 예정이라 ANDROID하위는 모두 패스 하도록 설정했습니다.


소스는 간단합니다. 

@REQUESTMAPPING(VALUE = "POSTFORMDATA", METHOD=REQUESTMETHOD.POST, 

PRODUCES = "APPLICATION/JSON;CHARSET=UTF-8")

PUBLIC @RESPONSEBODY STRING HANDLEFORMUPLOAD(MULTIPARTFILE FILE,HTTPSERVLETREQUEST REQUEST) THROWS IOEXCEPTION, EXCEPTION {

여기에 DB에 저장하든 파일로 저장하든 로직 이 구현되면 됩니다.

}


안드로이드 소스를 살펴보겠습니다.


private class uploadImageTask extends AsyncTask<Void, Void, String> {


private String url_address;

private MultiValueMap<String, Object> formData;

public uploadImageTask(String url, String values) {
deviceInfo();
this.url_address = url;
FileSystemResource file = new FileSystemResource( values );
formData = new LinkedMultiValueMap<String, Object>();
try {
formData.add("description", "meseoul");
formData.add("file", file);
formData.add("user_name", Global.User_name.getBytes("UTF-8"));
formData.add("s00741", "s00741");
formData.add("good", "good");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(Void... params) {
String result = "";
Util.Log( "url:> " + url_address );
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType( MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(
formData, requestHeaders );
RestTemplate restTemplate = new RestTemplate( true );
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter( Charset.forName("UTF-8")));
ResponseEntity<String> response = restTemplate.exchange( url_address, HttpMethod.POST, requestEntity,
String.class );
result= response.getBody().toString();
return result;
}
@Override
protected void onPostExecute(String result) {
if(result.equals("YES"))
{
Toast.makeText(mContext, "서버에 저장되었습니다."+Global.User_name, Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(mContext, "저장을 실패했습니다."+Global.User_name, Toast.LENGTH_LONG).show();
}

}

}


uploadImageTask a = new uploadImageTask( Global.UrlAddress + "/android/postformdata", saveFilePath );
a.execute();


안드로이드 스프링을 사용하였는데요. 

세팅법은 최신버전을 찾아서 하시면 됩니다. 

BUILD.GRADLE 파일에

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.11'
compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation files('libs/jsoup-1.11.2.jar')
implementation files('libs/json-simple-1.1.1.jar')
implementation files('libs/sdk-v1.0.0.jar')

}


안드로이드 UTF-8 전송시 한글 깨지는데 저는 저렇게 해줬습니다. 

formData.add("user_name", Global.User_name.getBytes("UTF-8"));


블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,

SPRING FRAMEWORK 시작하기 스프링 시작하기 1

스프링을 시작해보자. ~!!

일단 개발환경 설정

이클립스에서 STS플러그인을 다운받아 설치하여 시작하여도 되지만. SRPING.IO.에 접속하여 STS 툴을 다운받아 설치하는 과정을 보자

http://spring.io/tools/sts/all

최신버전을 다운로드 받아 설치 하자.

설치후 실행을 하고 작업폴더를 설정한다.

그리고 신규 프로젝트를 누르고 

SPRING LEGACY PROJECT 를 선택한다.

그리고 아래쪽 SPRING MVC PROJECT를 선택하고 프로젝트네임설정하고 

FINISH를 누른다.



블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,