ssi 프레임 워 크 학습 총화(mvc 3 층 구조)
24686 단어 ssi 프레임
프레임 구조:
이것 은 제 가 인터넷 에서 찾 은 ssi 프레임 워 크 에 관 한 구조 그림 입 니 다.개인 적 으로 잘 그 렸 다 고 생각 합 니 다.입문 자 에 게 차원 기구 가 뚜렷 하고 실 용적 입 니 다(이 큰 공유 에 감 사 드 립 니 다).
여기 서 ssi 프레임 워 크 의 대체 구조 와 각 층 간 의 상호작용 상황 을 뚜렷하게 볼 수 있 습 니 다.꼭대기 층 의 표현 층 은 자바 에 있어 주로 jsp,html 등 시각 도 층 기술 의 작성 입 니 다.그 중에서 우리 가 잘 아 는 자바 script,jquery 와 extjs 등 이 있 습 니 다.제어 층 에서 볼 때 주로 strust 2 태그 기능 을 이용 하여 action 과 시각 층 의 데이터 교 류 를 실현 합 니 다.물론 ajax 의 기술 로 같은 기능 을 실현 할 수 있 습 니 다.이것 은 개인 적 인 취향 에 따라 이 루어 집 니 다.비 즈 니스 논리 층 에서주로 spring 의 의존 주입 을 이용 하여 업무 논리 류 와 dao 류 의 인 스 턴 스 위탁 관 리 를 실현 합 니 다.물론 각종 인 스 턴 스 는 spring 에서 통일 적 인 관리 와 관련 을 할 수 있 습 니 다.사무,데이터 소스 등 을 포함 합 니 다.지구 층 에 서 는 ibatis 가 제공 하 는 반자동 화 된 대상 관계 맵 의 실현 을 이용 하여 개발 자 는 필요 에 따라 구체 적 인 sql 문 구 를 작성 하고 해당 하 는 xml 설정 을 통 해 데이터 베 이 스 를 조작 할 수 있 습 니 다.
한 마디 로 하면 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 와 관련 된 의존 파일 만 캡 처 합 니 다.
이렇게 기본 적 인 환경 이 생기 면 데이터베이스 디자인 은 모델 층 의 대상 에 따라 확정해 야 한다.
두 번 째 단 계 는 관련 모델 층 을 만 듭 니 다.코드 는 다음 과 같 습 니 다.
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 의 틀 은 꽤 괜찮다 고 생각한다.적어도 맞 춤 형 과 자유도 가 비교적 좋다.