ssi 프레임 워 크 학습 총화(mvc 3 층 구조)

24686 단어 ssi 프레임
여러분 들 이 뮤 직 비디오 c 의 3 층 구조 에 대해 잘 알 고 있 을 것 이 라 고 믿 습 니 다.여기 서 자세히 말 하지 않 겠 습 니 다.개인 적 으로 ssi 의 구조 가 전형 적 인 뮤 직 비디오 3 층 구조 이 고 쉽게 시작 할 수 있다 고 생각 합 니 다.이 입문 에 대해 저 는 FrankHui 어린이 신발 에 특별히 감 사 를 드 리 고 싶 습 니 다.그의 도움 을 받 아 저 는 이 구 조 를 빨리 익 힐 수 있 었 고 ssi 의 구 조 를 배 우 는 데 도움 이 되 었 습 니 다.ssi 의 구 조 는 주로 struts 2,spring 과 ibatis 로 구성 되 는데 그들 은 각 층 간 의 상호작용 과 협력 을 책임 지고 전체 웹 엔 드 의 기능 실현 과 통합 을 실현 한다.Struts 는 현재 데이터 전달 과 통 제 를 주로 담당 하고 있 으 며,spring 은 강력 한 의존 주입 기술 로 bean 위탁 관리 와 통합 등 기능 을 실현 하고 있다.물론 이것 은 spring 기능 중의 빙산 의 일각 일 뿐 이 고,ibatis 는 경량급 OR Mapping 프레임 워 크 로 서 반자동 화 대상 관계 맵 의 실현 을 제공 하 였 으 며,자유 도 는 hibenate 보다 높다.
프레임 구조:
이것 은 제 가 인터넷 에서 찾 은 ssi 프레임 워 크 에 관 한 구조 그림 입 니 다.개인 적 으로 잘 그 렸 다 고 생각 합 니 다.입문 자 에 게 차원 기구 가 뚜렷 하고 실 용적 입 니 다(이 큰 공유 에 감 사 드 립 니 다).
ssi框架学习总结
여기 서 ssi 프레임 워 크 의 대체 구조 와 각 층 간 의 상호작용 상황 을 뚜렷하게 볼 수 있 습 니 다.꼭대기 층 의 표현 층 은 자바 에 있어 주로 jsp,html 등 시각 도 층 기술 의 작성 입 니 다.그 중에서 우리 가 잘 아 는 자바 script,jquery 와 extjs 등 이 있 습 니 다.제어 층 에서 볼 때 주로 strust 2 태그 기능 을 이용 하여 action 과 시각 층 의 데이터 교 류 를 실현 합 니 다.물론 ajax 의 기술 로 같은 기능 을 실현 할 수 있 습 니 다.이것 은 개인 적 인 취향 에 따라 이 루어 집 니 다.비 즈 니스 논리 층 에서주로 spring 의 의존 주입 을 이용 하여 업무 논리 류 와 dao 류 의 인 스 턴 스 위탁 관 리 를 실현 합 니 다.물론 각종 인 스 턴 스 는 spring 에서 통일 적 인 관리 와 관련 을 할 수 있 습 니 다.사무,데이터 소스 등 을 포함 합 니 다.지구 층 에 서 는 ibatis 가 제공 하 는 반자동 화 된 대상 관계 맵 의 실현 을 이용 하여 개발 자 는 필요 에 따라 구체 적 인 sql 문 구 를 작성 하고 해당 하 는 xml 설정 을 통 해 데이터 베 이 스 를 조작 할 수 있 습 니 다.
한 마디 로 하면 SSI 프레임 워 크 는 우리 코드 의 결합 도 를 낮 추고 코드 의 건장 성과 재 활용 성 을 강화 하 며 개발 속 도 를 가속 화 할 수 있 지만 부족 한 점도 있다.예 를 들 어 세 가지 프레임 워 크 의 설정 파일 이 비교적 많 기 때문에 우리 에 게 불편 을 가 져 왔 다.특히 작은 응용 에 있어 더욱 그렇다.
관련 데모 소개:
이전에 ssi 프레임 워 크 에 대한 학습 을 바탕 으로 저 는 사용자 관리 웹 을 선택 하 는 것 을 피 할 수 없습니다.프로젝트 의 대체적인 구 조 는 다음 과 같 습 니 다.
ssi框架学习总结
대체적으로 3 층 의 분 층 모델 에 따라 분 리 된 것 이 고 구체 적 으로 는 상세 하 게 말 하지 않 으 며 여러분 도 전체 구 조 를 잘 아 실 것 이 라 고 믿 습 니 다.
Ø  개발 환경 소개:
도구:eclipse 3.6+tomcat 7+mysql 5.1
프레임 워 크:struts 2,spring 3.0.5,ibatis 2.3.4.726
개발 절차 및 설정 안내:
첫 번 째 단 계 는 관련 lib 라 이브 러 리 를 가 져 오 는 것 으로 알려 져 있 습 니 다.제 가 사용 하 는 전단 은 extjs 이기 때문에 extjs 와 관련 된 js 와 css 의존 파일 도 가 져 와 야 합 니 다.lib 라 이브 러 리 가 너무 많 기 때문에 캡 처 하지 않 고 extjs 와 관련 된 의존 파일 만 캡 처 합 니 다.
ssi框架学习总结
이렇게 기본 적 인 환경 이 생기 면 데이터베이스 디자인 은 모델 층 의 대상 에 따라 확정해 야 한다. 
두 번 째 단 계 는 관련 모델 층 을 만 듭 니 다.코드 는 다음 과 같 습 니 다.
User.java:

package com.broada.demo.entity;
/**
 * 
 * @author smm
 *
 */
public class User {
 
	private int id;     //  id
	private String name;		//    
	private String password;	//    
	private String username;	//    
	private String address;		//  
 
	
	public String getUsername() {
		return username;
	}
 
	public void setUsername(String username) {
		this.username = username;
	}
 
	public String getAddress() {
		return address;
	}
 
	public void setAddress(String address) {
		this.address = address;
	}
 
	public int getId() {
		return id;
	}
 
	public void setId(int id) {
		this.id = id;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public String getPassword() {
		return password;
	}
 
	public void setPassword(String password) {
		this.password = password;
	}
 
}
세 번 째 단계,strust 의 관련 설정 은 strust 의 단독 설정 과 원 리 를 상세 하 게 설명 하지 않 습 니 다.인 스 턴 스 의 관련 설정 파일 은 주로 strust.xml 과 웹.xml 의 관련 설정 이 고 부분 은 다음 과 같 습 니 다.
Web.xml:

<!-- struts2   -->
  <filter>
    <filter-name>struts2</filter-name>
    <!--     struts2       -->
    <filter-class>
      org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
    
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
strust.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <!--          ,      <s:include>    ,       ,      ,     ,struts2      UTF-8,          jsp                。      jsp         -->
  <constant name="struts.i18n.encoding" value="UTF-8" />
	<!--   struts2,   spring    ,         -_-!!! -->
  <constant name="struts.objectFactory" value="spring" />
	<!-- struts2    ,  struts1   ,  .do,struts2   .action,       ,  .dxd -->
  <constant name="struts.action.extension" value="action" />
	<!--      -->
  <constant name="struts.custom.i18n.resources"
    value="messageResource">
  </constant> 
 
  <!--       -->
	<!-- abstract       action          action, class   registerAction  spring    -->
  <package name="register" extends="struts-default">
    <action name="register" class="registerAction" method="addUser">
      <!--      -->
      <result name="success">success.jsp</result>
      <!--      -->
      <result name="input">error.jsp</result>
    </action>
    <action name="login" class="registerAction" method="loginUser">
    	<!--      -->
      <result name="success">success.jsp</result>
      <!--      -->
      <result name="error">error.jsp</result>    	
    </action>
  </package> 
</struts>
이렇게 strust 의 설정 은 대체로 완성 되 었 다. 
네 번 째 단계:ibatis 와 관련 된 프로필 을 설정 합 니 다.주로 jdbc.properties,SqlMapConfig.xml 및 User.xml 의 설정 입 니 다.jdbc.properties 는 데이터 베 이 스 를 설정 하 는 데이터 소스 파 라 메 터 를 사용 합 니 다.spring 을 불 러 올 때 자동 으로 초기 화 됩 니 다.ibatis 데이터 소스 의 설정 은 spring 에 맡 길 수 있 기 때문에 자세히 설명 하지 않 습 니 다.SqlMapConfig.xml 는 주로 ibatis 설정 파일 의 위 치 를 설정 하고 User.xml 는 관련 데이터베이스 문 구 를 작성 하 는 데 사 용 됩 니 다.설정 은 대체적으로 다음 과 같 습 니 다.
jdbc.properties:

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/userinfo
jdbc.user=root
jdbc.password=123456
jdbc.minPoolSize=5
jdbc.maxPoolSize=20
jdbc.maxIdleTime=1800
jdbc.acquireIncrement=5
jdbc.maxStatements=50
jdbc.initialPoolSize=10
jdbc.idleConnectionTestPeriod=1800
jdbc.acquireRetryAttempts=30
상세 한 매개 변 수 는 spring 의 설정 파일 에 언급 되 므 로 자세히 말 하지 않 겠 습 니 다.
SqlMapConfig.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!--       -->
<sqlMap resource="com/broada/demo/dao/ibaties/map/User.xml" />
</sqlMapConfig>
User.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"   
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
  <typeAlias alias="User" type="com.broada.demo.entity.User" />
  <!--        -->
  <insert id="insertUser" parameterClass="User">
    insert into
    user (name,password,username,address)values(#name#,#password#,#username#,#address#)
  </insert>
  
  <select id="selsectUser" parameterClass="java.lang.String" resultClass="User">
  	select * from user
  	where name = #name#;
  </select>
</sqlMap>
이렇게 하면 ibatis 의 설정 이 대체적으로 완 성 됩 니 다.
다섯 번 째 단계:spring 의 관련 프로필 을 설정 합 니 다.주로 ibatis 와 strust 에 사용 되 는 bean 을 통합 시 키 는 것 입 니 다.웹.xml 와 applicationContext-web.xml 두 개의 프로필 을 설정 해 야 합 니 다.
web.xml:

<listener>
    <!--          WebApplicationUtilContent -->
    <listener-class>
			org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
  <!-- springframework config files -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <!--  spring        /WEB-INF/  springframework  ,      ,      applicationContent-   xml  ,                     -->
    <param-value>
      /WEB-INF/spring/applicationContext-*.xml
    </param-value>
</context-param>
applicationContext-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  <!--      ,       c3p0,           c3p0   doc,    。 -->
  <bean id="dataSource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClass}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.user}" />
    <property name="password" value="${jdbc.password}" />
    <property name="minPoolSize" value="${jdbc.minPoolSize}" />
    <property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
    <property name="maxIdleTime" value="${jdbc.maxIdleTime}" />
    <property name="acquireIncrement"
      value="${jdbc.acquireIncrement}" />
    <property name="maxStatements" value="${jdbc.maxStatements}" />
    <property name="initialPoolSize"
      value="${jdbc.initialPoolSize}" />
    <property name="idleConnectionTestPeriod"
      value="${jdbc.idleConnectionTestPeriod}" />
    <property name="acquireRetryAttempts"
      value="${jdbc.acquireRetryAttempts}" />
  </bean>
 
  
  <!--        value       ,      ,         iBatis   ,   jdbc.properties,   c3p0      -->
  <bean id="propertyConfig"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
      <value>/WEB-INF/ibatis/jdbc.properties</value>
    </property>
  </bean> 
  
  <!--   iBatis sqlMapClient,        spring   ,  , SqlMapConfig     WEB-INF iBatis   ,       -->
  <bean id="sqlMapClient"
    class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation">
      <value>/WEB-INF/ibatis/SqlMapConfig.xml</value>
    </property>
    <!--                    -->
    <property name="dataSource">
      <ref bean="dataSource" />
    </property>
  </bean> 
 
  <bean id="userdaoId" class="com.broada.demo.daoImpl.UserDaoImpl">
   	<property name="sqlMapClient" ref="sqlMapClient"></property>
  </bean>
   
  <bean id="userDaoServiceId" class="com.broada.demo.serviceImpl.UserDaoServiceImpl">
   <property name="userdao" ref="userdaoId">
  </property>
  </bean> 
   <!--     action--> 
  <bean id="registerAction" name="registerAction" class="com.broada.demo.action.RegisterAction" scope="prototype">    
   <property name="userdaoServiceInter" ref="userDaoServiceId"></property>
  </bean> 
  
  
</beans>
이렇게 해서 ssi 프레임 워 크 의 대략적인 설정 이 완성 되 었 습 니 다. 
마지막 으로 관련 dao 층,service 층,action 층,jsp 등 을 작성 하면 자세 한 설명 은 하지 않 고 관련 코드 를 직접 올 립 니 다.
RegisterAction.java:

package com.broada.demo.action;
 
/**
 * @author smm
 */
 
import com.broada.demo.entity.User;
import com.broada.demo.service.UserDaoServiceInter;
import com.opensymphony.xwork2.ActionSupport;
 
public class RegisterAction extends ActionSupport {
	
	private static final long serialVersionUID = 1L;
	
private UserDaoServiceInter userdaoServiceInter;	
 
	public UserDaoServiceInter getUserdaoServiceInter() {
		return userdaoServiceInter;
	}
 
	public void setUserdaoServiceInter(UserDaoServiceInter userdaoServiceInter) {
		this.userdaoServiceInter = userdaoServiceInter;
	}
 
	private String name;  //   
	private String password;	//  
	private String username;	//  
	private String address;		//  
 
	public String getUsername() {
		return username;
	}
 
	public void setUsername(String username) {
		this.username = username;
	}
 
	public String getAddress() {
		return address;
	}
 
	public void setAddress(String address) {
		this.address = address;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public String getPassword() {
		return password;
	}
 
	public void setPassword(String password) {
		this.password = password;
	}
 
	public String addUser() {
		System.out.println("    !");
		User user = new User();
		
		String name = this.name;
		String password = this.password;
		String username = this.username;
		String address = this.address;
		
		user.setName(name);
		user.setPassword(password);
		user.setUsername(username);
		user.setAddress(address);
		
		boolean b = userdaoServiceInter.insertUser(user);
		
		if (b==true) {
			return SUCCESS;
		} else
			return INPUT;
	}
	
	public String loginUser(){
		System.out.println("  =======");
		
		String name = this.name;
		String password = this.password;
		
		User user = userdaoServiceInter.querybyname(name);
		
		if(user != null && password.equals(user.getPassword())){
			return SUCCESS;
		} else 
			return ERROR; 
	}
}
UserDao.java:

package com.broada.demo.dao;
 
/**
 * @author smm
 */
 
import java.util.List;
 
import com.broada.demo.entity.User;
 
public interface UserDao {
	
	/**
	 *     
	 * @param user
	 * @return
	 */
	
	public boolean insertUser(User user);
	
	/**
	 *            
	 * @param name
	 * @return
	 */
	
	public User queryByname(String name);	
}
UserDaoImpl.java:

package com.broada.demo.daoImpl;
/**
 * @author smm
 */
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
 
import com.broada.demo.dao.UserDao;
import com.broada.demo.entity.User;
 
public class UserDaoImpl extends SqlMapClientDaoSupport implements UserDao{
 
 
 
	@Override
	public boolean insertUser(User user) {
		try {
			getSqlMapClientTemplate().insert("insertUser", user);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}	
	}
 
	@Override
	public User queryByname(String name) {
		// TODO Auto-generated method stub
		try {
			User user =(User) getSqlMapClientTemplate().queryForObject("selsectUser", name);
			return user;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}		
	}
	
}
UserDaoServiceInter.java:

package com.broada.demo.service;
 
/**
 * @author smm
 */
 
import com.broada.demo.entity.User;
 
public interface UserDaoServiceInter {
	
	/**
	 *         
	 * @param user
	 * @return
	 */
	
	public boolean insertUser(User user);
	
	/**
	 *              
	 * @param name
	 * @return
	 */
	
	public User querybyname(String name);
}
UserDaoServiceImpl.java:

package com.broada.demo.serviceImpl;
 
/**
 * @author smm
 */
 
import com.broada.demo.dao.UserDao;
import com.broada.demo.entity.User;
import com.broada.demo.service.UserDaoServiceInter;
 
public class UserDaoServiceImpl implements UserDaoServiceInter {
 
	private UserDao userdao;
	public UserDao getUserdao() {
		return userdao;
	}
	public void setUserdao(UserDao userdao) {
		this.userdao = userdao;
	}
	@Override
	public boolean insertUser(User user) {
		return userdao.insertUser(user);
	}
	@Override
	public User querybyname(String name) {
		// TODO Auto-generated method stub
		return userdao.queryByname(name);
	}
 
}
Index.jsp:

<%@ page language="java" contentType="text/html; charset=utf8"
	pageEncoding="utf8"%>
	<%@ taglib prefix="s" uri="/struts-tags"%>
<!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=utf8">
<link rel="stylesheet" type="text/css" href="css/ext-all.css" />
<link rel="stylesheet" type="text/css"
	href="css/ext-theme-classic-all.css" />
<script type="text/javascript" src="js/ext-all.js"></script>
 
 
<title>    </title>
<script type="text/javascript">
Ext.onReady(function(){
		initPanel();	 
	});
	
	initPanel=function(){
		 var formPanel = new Ext.FormPanel({
			  id: 'loginPanel',
			  labelWidth: 75, 
			  frame:true,
			  bodyStyle:'margin:0 auto',
			  width: 350,
			  defaults: {width: 250},
			  defaultType: 'textfield',
			  items: [{id: 'username',fieldLabel: '   ',name:'name',allowBlank: false,blankText: '      '},
			  {id: 'password', fieldLabel: '   ',name:'password',inputType: 'password',allowBlank: false,blankText: '      '}]
			     });
		var win = new Ext.Window({  
			  title:'    ', 
			  width:380,
			  autoHeight: 'true',
			  resizable: false,
			  modal:true,
			  closeAction: 'hide',
			  buttonAlign:'center',
			  items:formPanel,
			  buttons:[{text: '  ',handler: function(){land();}},
			      {text: '  ',handler: function(){
			        Ext.getCmp('username').setValue("");
			        Ext.getCmp('password').setValue("");
			        }},{text: '  ',handler: function(){register();}}]
			   });
			       
		win.show();
	};
	
	var win1;
	
	register = function(){	
		
		var registerPanel = new Ext.FormPanel({
		  id: 'registerPanel',
		  labelWidth: 75, 
		  frame:true,
		  bodyStyle:'margin:0 auto',
		  width: 350,
		  defaults: {width: 250},
		  defaultType: 'textfield',
		  items: [{id: 'registername',fieldLabel: '   ',name:'name1',allowBlank: false,blankText: '      '},
		  {id: 'registerpassword', fieldLabel: '     ',name:'password1',inputType: 'password',allowBlank: false,blankText: '      '},
		  {id: 'registerpassword2', fieldLabel: '    ',name:'password2',inputType: 'password',allowBlank: false,blankText: '      '},
		  {id: 'nichen',fieldLabel: '  ',name:'nichen1'},
		  {id: 'address',fieldLabel: '  ',name:'address1'}]
		     });
		
		win1 = new Ext.Window({  
			  title:'    ', 
			  width:380,
			  autoHeight: 'true',
			  resizable: false,
			  modal:true,
			  buttonAlign:'center',
			  items:registerPanel,
			  buttons:[{text: '  ',handler: function(){login();}},
			      {text: '  ',handler: function(){win1.close();}}]
			   });
			       
		win1.show();
	};
	
	login=function(){
		var name = Ext.getCmp('registername').getValue(); 
		var password = Ext.getCmp('registerpassword').getValue();
		var password2 = Ext.getCmp('registerpassword2').getValue();
		var nichen = Ext.getCmp('nichen').getValue();
		var address = Ext.getCmp('address').getValue();
		
		if(name==" "|| password==" " || password2==""){
			Ext.MessageBox.alert('  ','         !');
		}
		else if(password != password2){
			Ext.MessageBox.alert('  ','         !');
		}else{
		 Ext.Ajax.request({
       url: "<s:url value='/register.action'/>",
       method: 'post',
  		params:{
  			name:name,
  			password:password,
  			username:nichen,
  			address:address
  		},
       success: function (response, options) {
      	Ext.MessageBox.alert('  ','    ',function(e){
      		if(e == "ok"){
      			win1.close();
      		} 
      	 });
        
       },
       failure: function (response, options) {
         Ext.MessageBox.alert('    ', '         !');
       }
     });
		}
	};
	
	land=function(){
		var name = Ext.getCmp('username').getValue(); 
		var password = Ext.getCmp('password').getValue();
		
		
		if(name == " " || password == ""){
			 Ext.MessageBox.alert('  ', '         !');
		}
		else{
		 Ext.Ajax.request({
       url: "<s:url value='/login.action'/>",
       method: 'post',
  		params:{
  			name:name,
  			password:password  			
  		},
       success: function (response, options) {
      	Ext.MessageBox.alert('  ','    !');
        
       },
       failure: function (response, options) {
         Ext.MessageBox.alert('    ', '           !');
       }
     });
		}
	};
	
</script>
 
</head>
<body>
	
</body>
</html>
대체적인 절 차 는 바로 이렇다.개인 적 으로 ssi 의 틀 은 꽤 괜찮다 고 생각한다.적어도 맞 춤 형 과 자유도 가 비교적 좋다.

좋은 웹페이지 즐겨찾기