Spring4,Struts2,mybaits作為架構

  • Spring : 4.06
  • Strust2 : 2.3.16
  • Mybaits : 3.30

所需jar檔已整合到 jar.rar 裡面 請下載

配置Struts2

所需要用到的jar檔在strust2資料夾裡面分別是
  • struts2-core-2.3.16.3.jar
  • xwork-core-2.3.16.3.jar
  • commons-lang-2.4.jar
  • commons-fileupload-1.3.1.jar
  • freemarker-2.3.19.jar
  • ognl-3.0.6.jar
  • javassist-3.11.0.GA.jar
  • commons-io-2.2.jar
  • commons-lang3-3.1.jar

將這些jar檔直接複製貼進去workspace下你的專案裡

WebContent\WEB-INF\lib裡面去

EX:

我的workspace是D:\spring_struts_mybaits

專案名稱是test3

所以把jar檔丟到D:\spring_struts_mybaits\test3\WebContent\WEB-INF\lib 這裡面

然後記得重新整理你的專案

為Struts2設定web.xml

接下來在WebContent下的WEB-INF修改裡面的web.xml

<?xml version="1.0″ encoding="UTF-8″?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

version="2.5″>

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

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

</filter-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

接下來在java Resources下的src建立一個xml叫做struts.xml並在裡面加入

<!DOCTYPE struts PUBLIC

“-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

“http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>

<package name="xxxxxxxx" extends="struts-default">

<action name="xxxx" class="xxxx.xxxx" method="xxxx">

<result name="success">xxxx.jap</result>

</action>

</package>

</struts>

以上xxxx的部份可以自己命名

class=”xxxxx.xxxxx” 的部份需要對應到src底下的java檔       method=”xxxx” 則是java檔裡的函式名稱

如下:

<?xml version="1.0″ encoding="UTF-8″?>

<!DOCTYPE struts PUBLIC

“-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"

“http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">

<action name="index" class="action.IndexAction" method="index">

<result name="success">/Home/test.jsp</result>

</action>

</package>

</struts>

因為我在class這個地方命名了action.IndexAction

所以我要在src底下的建一個包叫action,然後在action裡面建立IndexAction.java

而我在method這個地方命名了index

則需要在indexAction.java裡面建立一個名為index的method

package action;

import com.opensymphony.xwork2.ActionSupport;

public class IndexAction extends ActionSupport {

     public String index() {

        return "success";

     }

}

當中return “success“; 是為了要與 struts.xml 中的  <result name=”success”>/Home/test.jsp</result> 的result相符合

並在WebContent底下建立一個叫Home的資料夾,並在資料夾中建立一個test.jsp

接著將專案放到tomcat上面

放上去以後再網址列打上http://localhost:8080/xxxxxx/index.action

xxxxxxx為專案名稱

看看struts2有沒有成功運行起來

配置Spring

所需要的jar在spring資料夾裡面,應該有24個jar檔,如下:

一樣將這些jar檔直接複製到WebContent\WEB-INF\lib裡面去

記得重新整理你的專案

再次修改web.xml,增加spring設定內容

接下來要修改剛剛在WebContent下的web.xml,在剛剛struts前面加入

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>xxxxxxxxx.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

其中xxxxxxxxxx.xml是Spring設定檔的位置及名稱

若有多個時用逗點分開

如果沒有設定Spring的設定檔的話,那預設會抓applicationContext.xml

完整如下:

<?xml version="1.0″ encoding="UTF-8″?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

version="2.5″>

<display-name>test222222</display-name>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

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

</filter-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

設置Spring的設定檔

在web.xml中只有設定<param-value>classpath:applicationContext.xml</param-value>這一個

所以我接下來在src底下建立一個applicationContext.xml

在裡面先加入

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.1.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.1.xsd “>

</beans>

然後接下來要把Struts2納入Spring的控管之下

所以要再加入一行

<bean id=”xxxxxx” class=”xxxxx.xxxx”></bean>

id隨便取,class是指要指定的class檔

<?xml version="1.0″ encoding="UTF-8″?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.1.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.1.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.1.xsd “>

<bean id="indexAction" class="action.IndexAction"></bean>

</beans>

接著再把Struts.xml打開

將原本action class的名稱 改成在Spring設定檔中的bean id的名稱

例如原本我是<action name=”index” class=”action.IndexAction” method=”index”>

改為我剛剛在Spring設定檔中的bean id 的indexAction

然後一樣將專案放到tomcat上面

一樣再網址列打上http://localhost:8080/xxxxxx/index.action

xxxxxxx為專案名稱

加上mybatis

讓專案的架構變成Struts2 + Spring+mybatis

配置mybatis所需要的jar在mybatis資料夾裡面

  • mybatis-3.3.0-SNAPSHOT.jar
  • mybatis-spring-1.2.2.jar
  • mysql-connector-java-5.1.22-bin.jar

一樣將這些jar檔直接複製到WebContent\WEB-INF\lib裡面去

記得重新整理你的專案

接著我們先在mysql上面建一張測試用的table

CREATE TABLE user

(

id int(11) NOT NULL AUTO_INCREMENT,

username varchar(20) NOT NULL,

password varchar(20) NOT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然後再加入一筆資料

INSERT INTO user VALUES (’1′, ‘admin’, ‘admin’);

在src建一個vo     package然後在裡面建一個User.java

這裡面對應到sql裡面的user這張table

package vo;

public class User {

private int id;

private String username;

private String password;

public User(){}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String toString(){

return “User [id = "+ id +" , username = "+ username +"]" + " , password = “+ password;

}

}

再建一個dao package 裡面再建一個UserMapper.java

定義了新增 修改 刪除 查詢這四個方法

package dao;

import vo.User;

public interface UserMapper {

public User selectUser(User user);

public void insertUser(User user);

public void updateUser(User user);

public void deleteUser(int userId);

}

然後再另外建一個mybatis package 裡面再建一個UserMapper.xml

其中namespace指定到我們剛剛建的class

而select,insert,update,delete的id必須跟UserMapper.java裡面的方法同名

因為我們寫了public User selectUser(User user);

所以我們selectUser這裡的parameterType就是vo.User

resultType則是輸出型態

中間則是SQL語法

<?xml version="1.0″ encoding="UTF-8″?>

<!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN"

“http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dao.UserMapper">

<select id="selectUser" parameterType="vo.User" resultType="vo.User">

SELECT * FROM user WHERE username=#{username}

</select>

<insert id="insertUser" parameterType="vo.User" flushCache="true">

INSERT INTO user (username,password) VALUES (#{username},#{password})

</insert>

<update id="updateUser" parameterType="vo.User">

UPDATE user SET username=#{username},password=#{password} WHERE id=#{id}

</update>

<delete id="deleteUser" parameterType="int">

DELETE FROM user WHERE id=#{id}

</delete>

</mapper>

然後在src建立一個mybatis的設定檔 mybatis-config.xml

由於數據部分交給spring所以只需要設定剛剛的UserMapper.xml的位置就好

<?xml version="1.0″ encoding="UTF-8″?>

<!DOCTYPE configuration PUBLIC

“-//mybatis.org//DTD Config 3.0//EN"

“http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<mappers>

<mapper resource="mybatis/UserMapper.xml"/>

</mappers>

</configuration>

然後再回去修改Spring的設定檔applicationContext.xml

整合Spring和mybatis

加上

<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>org.gjt.mm.mysql.Driver</value>

</property>

<property name="url">

<value>jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</value>

</property>

<property name="username">

<value>root</value>

</property>

<property name="password">

<value>root</value>

</property>

</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="jdbcDataSource" />

<property name="configLocation" value="classpath:mybatis-config.xml"></property>

</bean>

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

<property name="mapperInterface" value="dao.UserMapper"></property>

<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>

</bean>

然後在原本的<bean id=”indexAction” class=”action.IndexAction”>加入參數

<property name=”userMapper” ref=”userMapper” />

其中sqlSessionFactory和userMapper所需要的class檔在mybatis-spring-1.2.2.jar裡

先回去strust2增加新增 修改 刪除 查詢的action

Name=* 代表說你填的action名  之後method={1}  會代表你填的action

例如我有個action 叫做select 他就會去找有沒有select這個方法

如果沒有這個方法就會報錯

<action name=”*” class=”indexAction” method=”{1}”>

<result name=”success”>/Home/test2.jsp</result>

<result name=”fail”>/Home/test.jsp</result>

</action>

如果不這樣打的話就要設定四個action

設定四個action

然後回去indexAction增加一下那四個方法

package action;

 

import com.opensymphony.xwork2.ActionSupport;

import vo.User;

import dao.UserMapper;

import org.apache.struts2.interceptor.ServletRequestAware;

import javax.servlet.http.HttpServletRequest;

 

public class indexAction extends ActionSupport implements  ServletRequestAware{

    private String user;

    private String password;

    private String id;

    HttpServletRequest request = null;

    private UserMapper userMapper;

    public String index(){

        return “success";

    }

    public String select(){

        String result = “fail";

        try{

            User u=new User();

            u.setUsername(user);

            request.setAttribute(“result", userMapper.selectUser(u));

            result = “success";

        }catch(Exception e){

            result = “fail";

        }

        return result;

    }

 

    public String insert(){

        String result = “fail";

        try{

            User u=new User();

            u.setUsername(user);

            u.setPassword(password);

            userMapper.insertUser(u);

            result = “success";

        }catch(Exception e){

            result = “fail";

        }

        return result;

    }

    public String update(){

        String result = “fail";

        try{

            User u=new User();

            u.setId(Integer.parseInt(id));

            u.setUsername(user);

            u.setPassword(password);

            userMapper.updateUser(u);

            result = “success";

        }catch(Exception e){

            result = “fail";

        }

        return result;

    }

    public String delete(){

        String result = “fail";

        try{

            userMapper.deleteUser(Integer.parseInt(id));

            result = “success";

        }catch(Exception e){

            result = “fail";

        }

        return result;

    }

    @Override

    public void setServletRequest(HttpServletRequest request) {


        this.request = request;

    }

    public String getUser() {

        return user;

    }

 

    public void setUser(String user) {

        this.user = user;

    }

 

    public String getPassword() {

        return password;

    }

 

    public void setPassword(String password) {

        this.password = password;

    }

    public String getId() {

        return id;

    }

 

    public void setId(String id) {

        this.id = id;

    }

 

    public UserMapper getUserMapper() {

        return userMapper;

    }

 

    public void setUserMapper(UserMapper userMapper) {

        this.userMapper = userMapper;

    }

}

然後修改一下test.jsp

修改test.jsp

在body中加入這些

<form action="select" method="post">

帳號:<input name="user" type="text" value=""/>

<input type="submit" value="查詢" />

</form>

<br>

<br>

<form action="insert" method="post">

帳號:<input name="user" type="text" value=""/>

密碼:<input name="password" type="text" value=""/>

<input type="submit" value="新增" />

</form>

<br>

<br>

<form action="update" method="post">

編號:<input name="id" type="text" value=""/>

帳號:<input name="user" type="text" value=""/>

密碼:<input name="password" type="text" value=""/>

<input type="submit" value="修改" />

</form>

<br>

<br>

<form action="delete" method="post">

編號:<input name="id" type="text" value=""/>

<input type="submit" value="刪除" />

</form>

然後在Home下新增一張test2.jsp當結果頁

在body中加入這句

${result}

就可以測試了