自己手动写javaEE框架--引入struts2框架

自己手动写javaEE框架--引入struts2框架

软件152 彭梦月

今天我要把struts2框架引入到我正在写的应用框架里面,我的java web容器使用tomcat,我先建一个index.jsp文件,里面内容很简单,在body里面一句话Hello My javaEE!,然后把工程导入到tomcat下面。

在浏览器地址栏里填写http://localhost:8080/ssiprj/index.jsp,结果如下图:

自己手动写javaEE框架--引入struts2框架

我们在打包到tomcat下的目录看看,路径如下图:

自己手动写javaEE框架--引入struts2框架

在javaEE工程里面,配置文件的默认路径都是在WEB-INFclasses下面,这样当tomcat启动时候会自动检测到这些配置文件,而实际上这些配置文件放的极其分散。

为了便于源代码的管理,我都会把配置文件放到统一的文件夹里面,当然也可以分散放置,然后用ant这样的工具进行部署,但我觉得再去编写ant文件太麻烦,而且我现在写这套框架要有重点,锦上添花的事情到了后面扩展时候在做讨论,我现在工程里面没有用到ant,而我的配置文件是这么写的,先看我的工程的目录结构,如下图:

自己手动写javaEE框架--引入struts2框架

conf和src在同一个层级的目录下,我修改了工程目录下的.classpath文件,里面添加了<classpathentry kind="src" path="conf"/>以及修改了编译后的文件输入的文件夹<classpathentry kind="output" path="WebContent/WEB-INF/classes"/>,完全的配置如下:

自己手动写javaEE框架--引入struts2框架

以前写dao,service时候引用配置文件的路径要做下修改,现在是默认路径,不用指定到那个文件夹,修改的文件有(代码框里上面是源代码,下面部分是修改后的代码): 

   applicationContext.xml:

 自己手动写javaEE框架--引入struts2框架

web.xml文件:

自己手动写javaEE框架--引入struts2框架

再看看部署到tomcat工程目录下的配置文件,如下图:

自己手动写javaEE框架--引入struts2框架

配置文件被解析到了WEB-INFclasses目录下了。

  下面我们正式导入struts2框架了,首先我在工程新添加如下jar包,如下图:

自己手动写javaEE框架--引入struts2框架

接下来我修改了web.xml配置文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app >
<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配置文件,代码如下:

自己手动写javaEE框架--引入struts2框架

接下来我在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;
}



}
自己手动写javaEE框架--引入struts2框架

  里面有两个方法,一个是查询数据,一个方法做新增操作。@Controller注解表明这是MVC的控制层。

  在conf下面,我再添加一个配置文件struts-action.xml,代码如下:

自己手动写javaEE框架--引入struts2框架
<?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里面加入这一句话:
自己手动写javaEE框架--引入struts2框架

如下图结构,我们在WEB-INF下面建立jsp包,里面新建users.jsp文件

自己手动写javaEE框架--引入struts2框架


代码如下:

<%@ 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" />
</form>
</body>
</html>

<%@ taglib prefix="s" uri="/struts-tags" %>:我们在页面里面导入了struts标签;

  页面里有两个form,name="queryForm" 的form做查询操作,name="addForm"的form做新增操作。

  启动tomcat服务器。

  我们在地址栏填入:http://localhost:8080/ssiprj/usersinit.action结果如下: 

自己手动写javaEE框架--引入struts2框架

自己手动写javaEE框架--引入struts2框架

直接点击query按钮,结果如下:

自己手动写javaEE框架--引入struts2框架

录入用户名:sharpxiajun;密码:sharpxiajun,点击ADD按钮,在点击query按钮,结果如下:

自己手动写javaEE框架--引入struts2框架

数据新增成功了。

框架现在看起来比较完整了,从客户端可以一直到数据库了,一马平川,这个感觉很爽,不过现在的struts用到的特性并不是我期望用到的,我会把action返回给前端的数据封装成json对象,

而前段也是封装成json传递给action,这个就符合一切层与层之间的通讯都是用键值对的形式,前端我会使用到ajax,这是前端的方向所在,另外,我不会在客户端使用自定义标签,客户端是设计者的天地,只有javascript才能塑造最完美的页面。