引入struts

軟件151 盧軍其javascript

 

最近發現公司裏有點人心惶惶,裁人,裁人,也不知道會不會輪到我,作技術的最大好處就是面對這樣的局面,心理老是比較坦然的,不過要是忽然來了變故,總會噁心下本身,仍是爲了本身的生存而努力吧。想一想本身幹了這麼多年軟件,一直都是java軟件工程師,雖然如今比較迷戀前端,可是前端總會被那些不懂的人說成廉價貨,因此寫幾套java框架如今對我而言仍是很是的重要的,我想成爲技術牛人,想當公司裏的首席技術架構師,總不能靠說吧,還得靠本身實實在在的實力,我必定要把這麼多年接觸過、使用過以及學習過的技術都寫出來,沒有爲本身留下技術成長的痕跡,晚上必定會被遺憾鬼纏上,加油哈!html

  今天我要把struts2框架引入到我正在寫的應用框架裏面,個人java web容器使用tomcat,我先建一個index.jsp文件,裏面內容很簡單,在body裏面一句話Hello My javaEE!,而後把工程導入到tomcat下面,這個過程我不寫了,不清楚的能夠查查baidu。前端

  在瀏覽器地址欄裏填寫http://localhost:8080/ssiprj/index.jsp,結果以下圖:java

  咱們在打包到tomcat下的目錄看看,路徑以下圖:web

 

   在javaEE工程裏面,配置文件的默認路徑都是在WEB-INF\classes下面,這樣當tomcat啓動時候會自動檢測到這些配置文件,而實際上你們看到了咱們的配置文件放的極其分散。ajax

   爲了便於源代碼的管理,我都會把配置文件放到統一的文件夾裏面,固然也能夠分散放置,而後用ant這樣的工具進行部署,但我以爲再去編寫ant文件太麻煩,並且我如今寫這套框架要有重點,錦上添花的事情到了後面擴展時候在作討論,我如今工程裏面沒有用到ant,而個人配置文件是這麼寫的,你們先看個人工程的目錄結構,以下圖:spring

 

 

  conf和src在同一個層級的目錄下,我修改了工程目錄下的.classpath文件,裏面添加了<classpathentry kind="src" path="conf"/>以及修改了編譯後的文件輸入的文件夾<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>,徹底的配置以下:sql

複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="conf"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk16">
<attributes>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/sringmvcstudy">
<attributes>
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>
</classpath>
複製代碼

 

  之前寫dao,service時候引用配置文件的路徑要作下修改,如今是默認路徑,不用指定到那個文件夾,修改的文件有(代碼框裏上面是源代碼,下面部分是修改後的代碼): 數據庫

   applicationContext.xml:apache

複製代碼
        <!-- 讀取資源文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:conf/constants.properties</value>
</list>
</property>
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:conf/SqlMapConfig.xml</value>
</property>
<property name="dataSource" ref="myDataSource"/>
</bean>


----------------------------------------------------------------------------

<!-- 讀取資源文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:constants.properties</value>
</list>
</property>
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
<property name="dataSource" ref="myDataSource"/>
</bean>
複製代碼

 

  web.xml文件: 

複製代碼
  <!-- spring配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/applicationContext*.xml</param-value>
</context-param>

-----------------------------------------------------------

<!-- spring配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
複製代碼

 

   咱們再看看部署到tomcat工程目錄下的配置文件,以下圖:

 

 

 

   配置文件被解析到了WEB-INF\classes目錄下了。

  下面咱們正式導入struts2框架了,首先我在工程新添加以下jar包,以下圖:

 

  接下來我修改了web.xml配置文件,以下:

複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>ssiprj</display-name>
<!-- spring配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<!-- 將spring框架裝載進咱們的工程裏 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<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>
複製代碼

 

  裏面加了三個過濾器,其中struts2這個過濾器就可讓工程里加載struts2框架,encodingFilter過濾器讓所用的請求響應都用UTF-8字符來處理;而actionContextcleanup過濾器來清除從前

臺頁面得到的屬性,這個寫在配置裏好處蠻多的,由於有時action緩存數據會形成一些很難發現的bug。

  而後我在conf目錄下創建struts.xml配置文件,代碼以下:

複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.action.extension" value="do,action,htm"/>
<constant name="struts.configuration.files" value="struts-default.xml,struts-plugin.xml,struts.xml"/>
</struts>
複製代碼

 

  接下來我在cn.com.sharpxiajun.common.action下新建了一個BaseAction,做爲action的基類,代碼以下:

複製代碼
package cn.com.sharpxiajun.common.action;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport implements ServletRequestAware,
ServletResponseAware, SessionAware, ServletContextAware {

private HttpServletRequest request = null;
private HttpServletResponse response = null;
private ServletContext context = null;
private Map<String, Object> map = null;

@Override
public void setServletContext(ServletContext context) {
this.context = context;

}

@Override
public void setSession(Map<String, Object> map) {
this.map = map;

}

@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;

}

@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;

}

public HttpServletRequest getRequest() {
return request;
}

public void setRequest(HttpServletRequest request) {
this.request = request;
}

public HttpServletResponse getResponse() {
return response;
}

public void setResponse(HttpServletResponse response) {
this.response = response;
}

public ServletContext getContext() {
return context;
}

public void setContext(ServletContext context) {
this.context = context;
}

public Map<String, Object> getMap() {
return map;
}

public void setMap(Map<String, Object> map) {
this.map = map;
}

}
複製代碼

 

  這裏我除了繼承ActionSupport外,還實現了ServletRequestAware,ServletResponseAware, SessionAware, ServletContextAware四個接口,這四個接口可讓咱們得到Servlet的四個原生對象request、response、session和ServletContext,使用struts框架經常會讓咱們忘記了上面四個對象,可是有些時候用原生態的這些對象仍是很是有好處的。BaseAction基類能夠作action一些公用的方法,咱們如今先作一個雛形,之後再慢慢擴展了。  

  在cn.com.sharpxiajun.action包下新建UsersAction類,它繼承BaseAction,代碼以下:

複製代碼
package cn.com.sharpxiajun.action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import cn.com.sharpxiajun.common.action.BaseAction;
import cn.com.sharpxiajun.service.UsersService;

@SuppressWarnings("serial")
@Scope("prototype")
@Controller("usersAction")
public class UsersAction extends BaseAction {

@Autowired
@Qualifier("usersService")
private UsersService usersService = null;

//輸入值
private String usernamequery;//查詢條件
private String username;//新增的用戶名
private String password;//新增密碼
private Integer enabled = 1;

//輸出值
private List<Map<String, Object>> results = null;//返回查詢的列表
private String msg = null;//系統運行信息
private String flag = null;//操做狀態標記
private String welcome = null;//歡迎語

public String usersinit() throws Exception
{
welcome = "歡迎使用本系統!";

return SUCCESS;
}

public String queryUsersList() throws Exception{

Map<String, Object> map = new HashMap<String, Object>();
map.put("username", usernamequery);

results = this.usersService.queryUsersList(map);

flag = "success";
msg = "查詢操做成功!";
welcome = "你的查詢操做已經完成!";

return SUCCESS;
}

public String addUsers()
{
Map<String, Object> map = new HashMap<String, Object>();

map.put("username", username);
map.put("password", password);
map.put("enabled", enabled);

try {
this.usersService.addUsers(map);
} catch (Exception e) {
flag = "error";
msg = "新增操做失敗!";
e.printStackTrace();
return ERROR;
}

flag = "success";
msg = "新增操做成功!";
welcome = "你的新增操做已經完成!";

return SUCCESS;
}

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 List<Map<String, Object>> getResults() {
return results;
}
public void setResults(List<Map<String, Object>> results) {
this.results = results;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}

public String getWelcome() {
return welcome;
}

public void setWelcome(String welcome) {
this.welcome = welcome;
}

public Integer getEnabled() {
return enabled;
}

public void setEnabled(Integer enabled) {
this.enabled = enabled;
}

public String getUsernamequery() {
return usernamequery;
}

public void setUsernamequery(String usernamequery) {
this.usernamequery = usernamequery;
}



}
複製代碼

 

  裏面有兩個方法,一個是查詢數據,一個方法作新增操做。@Controller註解代表這是MVC的控制層。

  在conf下面,我再添加一個配置文件struts-action.xml,代碼以下:

複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="action" extends ="struts-default">
<action name="queryUsersList" class="usersAction" method="queryUsersList">
<result name="success">/WEB-INF/jsp/users.jsp</result>
</action>
<action name="usersinit" class="usersAction" method="usersinit">
<result name="success">/WEB-INF/jsp/users.jsp</result>
</action>
<action name="addUsers" class="usersAction" method="addUsers">
<result name="success">/WEB-INF/jsp/users.jsp</result>
<result name="error">/WEB-INF/common/error.jsp</result>
</action>
</package>
</struts>
複製代碼

 

  其實struts2也能夠零配置的,可是我這個框架裏面我不想在控制層加入它自己的零配置特性,我在寫dao和service都是儘可能用零配置,可是零配置真的那麼好嘛?我一直不這麼認爲,固然我如今也沒有想到它的重要缺點,可是控制層裏的struts2的action配置我仍是寫道配置文件裏,那麼在UsersAction裏的註解就只是邏輯層次的配置,這樣各個邏輯層的註解都是統一的,而後咱們在struts.xml裏面加入這一句話:

<include file="struts-action.xml"/>

   以下圖結構,咱們在WEB-INF下面創建jsp包,裏面新建users.jsp文件

 

   代碼以下:

複製代碼
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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=UTF-8">
<title>用戶信息</title>
</head>
<body>
<form name="queryForm" method="post" action="queryUsersList.action">
<h1>系統返回值:<s:property value="welcome"/></h1>
<br/>
用戶名:<input type="text" id="usernamequery" name="usernamequery"/> &nbsp;&nbsp;<input type="submit" value="query"/>
</form>
<br/>
<br/>
<table border="1">
<thead>
<tr>
<th>用戶名</th>
<th>密碼</th>
<th>狀態</th>
</tr>
</thead>
<tbody>
<s:iterator value="results">
<tr>
<td>
<s:property value="username"/>
</td>
<td>
<s:property value="password"/>
</td>
<td>
<s:property value="enabled"/>
</td>
</tr>
</s:iterator>
</tbody>
</table>
<form name="addForm" method="post" action="addUsers.action">
<br/>
用戶名:<input type="text" id="username" name="username"/>
<br/>
密碼:<input type="text" id="password" name="password"/>
<br/>
&nbsp;&nbsp;<input type="submit" value="ADD"/>
</form>
</body>
</html>
複製代碼

 

  <%@ taglib prefix="s" uri="/struts-tags" %>:咱們在頁面裏面導入了struts標籤;

  頁面裏有兩個form,name="queryForm" 的form作查詢操做,name="addForm"的form作新增操做。

  啓動tomcat服務器。

  咱們在地址欄填入:http://localhost:8080/ssiprj/usersinit.action結果以下: 

 


  咱們直接點擊query按鈕,結果以下:

   我錄入用戶名:sharpxiajun;密碼:sharpxiajun,點擊ADD按鈕,在點擊query按鈕,結果以下:

  數據新增成功了。

  最後總結下了:個人框架如今看起來比較完整了,從客戶端能夠一直到數據庫了,一馬平川,這個感受很爽,不過如今的struts用到的特性並非我指望用到的,我會把action返回給前端的數據封裝成json對象,而前段也是封裝成json傳遞給action,這個就符合一切層與層之間的通信都是用鍵值對的形式,前端我會使用到ajax,這是前端的方向所在,另外,我不會在客戶端使用自定義標籤,客戶端是設計者的天地,只有javascript才能塑造最完美的頁面。後面我還會使用到模板語言velocity,freemarker,圖形技術jfreechart以及和這個作對比的fusioncharts(惋惜是要錢的),服務端也有不少內容能夠加進去,好比調度,緩存,webservice,mq等等,要是都寫完簡直是一個奇妙之旅。

相關文章
相關標籤/搜索