Maven搭建SSH(Struts2+Spring+Hibernate)框架入门教程(二)_2
2)Action
① Message.java 代码如下所示:
package cn.com.mvn.ssh.demo.web.vo;
public class Message {
private String code;
private String message;
public Message(String message) {
super();
this.message = message;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
UserAction.java
package cn.com.mvn.ssh.demo.web.action;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import cn.com.mvn.ssh.demo.entity.MvnUser;
import cn.com.mvn.ssh.demo.service.IUserService;
import cn.com.mvn.ssh.demo.web.vo.Message;
"userAction") (
public class UserAction {
"userService") (
private IUserService userService;
private MvnUser user;
private int id;
private String userName;
private String type;
private String status;
private int age;
private Message message;
// 新增用户的执行方法
public String addUser() {
String result = "addSuccess";
message = new Message("添加成功");
try {
// 调用service,创建用户
userService.createUser(user);
} catch (Exception e) {
e.printStackTrace();
message.setMessage("添加失败:" + e.getMessage());
}
return result;
}
// 删除用户的执行方法
public String deleteUser() {
String result = "deleteSuccess";
message = new Message("删除成功");
try {
userService.deleteUser(id);
} catch (Exception e) {
e.printStackTrace();
message.setMessage("删除失败:" + e.getMessage());
}
return result;
}
// 修改用户的执行方法
public String editUser() {
String result = "editSuccess";
this.message = new Message("修改成功!");
try {
userService.editUser(age, status, id);
} catch (Exception e) {
e.printStackTrace();
message.setMessage("修改失败:" + e.getMessage());
}
return result;
}
// 根据id或用户名查找单个用户的执行方法
public String searchUser() {
String result = "searchUserSeuccess";
if ("byId".equals(type)) {
user = this.userService.searchUser(id);
} else {
user = this.userService.searchUser(userName);
}
return result;
}
private List<MvnUser> userList;
// 查询所有用户列表的执行方法
public String searchUsers() {
String result = "searchUsersSuccess";
this.userList = this.userService.searchUsers();
return result;
}
public List<MvnUser> getUserList() {
return userList;
}
public void setUserList(List<MvnUser> userList) {
this.userList = userList;
}
public MvnUser getUser() {
return user;
}
public void setUser(MvnUser user) {
this.user = 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 getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
}
}
3)applicationContext.xml。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan
base-package="cn.com.mvn.ssh.demo" />
</beans>
4)struts.xml。
<struts>
<include file="struts-default.xml"></include>
<include file="struts-plugin.xml"></include>
<!-- 从Spring容器中获取Action对象 -->
<constant name="struts.objectFactory" value="spring"></constant>
<!-- 请求和Action方法的动态对应 -->
<constant name="struts.enable.DynamicMethodInvocation"
value="true" />
<package name="t" namespace="/" extends="json-default">
<action name="userAction" class="userAction">
<result name="searchUsersSuccess">/userList.jsp</result>
<result name="searchUserSeuccess" type="json">
<param name="root">user</param>
</result>
<result name="editSuccess" type="json">
<param name="root">message</param>
</result>
<result name="deleteSuccess" type="json">
<param name="root">message</param>
</result>
<result name="addSuccess" type="json">
<param name="root">message</param>
</result>
</action>
</package>
</struts>
5)web.xml。
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>MvnSSHDemo.Struts</display-name>
<!-- 启动Spring 容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<!-- struts2的总入口过滤器 -->
<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>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4. 安装发布测试
右击“工程”,选择 Run As→Maven install 命令。
Maven 会自动编译、测试代码,并且打成 war 包,将 war 包发布到指定的 Web 服务器的发布目录。接着就可以启动 Tomcat 服务器用浏览器进行测试了。浏览器操作过程同前面基于 Jsp/Servlet 开发的 Demo 一样。
整合成 SSH
按前面的操作,用户已经独立地实现了各自模块的功能,并且能将各自的功能封装成构件安装到本地仓库、发布到公司搭建的私服上面,供需要的地方当依赖构件使用。
这体现了模块化的思想,同时考虑到框架的依赖配置的共性,用户可以独立创建工程(POM),将每个独立框架的依赖配置都在公共 POM 工程中设置好。
其他要使用的工程只需继承它们就行了,不需要重复配置。比如,MvnSSHDemo.Struts 就是继承自 StrutsPOM。这体现了 Maven 开发过程中的继承运用思想。
但是,当测试 MvnSSHDemo.Struts 模块功能的时候,发现前面的依赖模块的实现需要修改,这时候就要对修改的模块工程进行独立的编译、测试、打包、安装和发布,然后再测试 MvnSSHDemo.Struts。
如果依赖的第三方模块很多,这样每次改动都需要对每个模块进行重复操作,很麻烦。
为了解决这个问题,Maven 里面有个“聚合”的概念。它能将一个个依赖的模块聚合成一个大项目(工程)。
下面创建一个项目,将 MvnSSHDemo 的相关模块都聚合到一起,同时操作,具体步骤如下。
1. 创建一个普通工程
聚合工程结构如图 3 所示。
图 3 聚合工程结构
2. 在 pom.xml 中配置每个模块
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.mvn.ssh.demo</groupId>
<artifactId>MvnSSHDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>MvnSSHDemo</name>
<url>http://maven.apache.org</url>
<modules>
<module>../MvnSSHDemo.DAO</module>
<module>../MvnSSHDemo.DAO.Hibernate</module>
<module>../MvnSSHDemo.Service</module>
<module>../MvnSSHDemo.Service.impl</module>
<module>../MvnSSHDemo.Struts</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
</plugins>
</build>
<distributionManagement>
<repository>
<id>archivaServer</id>
<url>http://localhost:8080/repository/internal</url>
</repository>
<snapshotRepository>
<id>archivaServer</id>
<url>http://localhost:8080/repository/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
注:这个 pom.xml 中没有太多信息,注意第 13、15、17 和 19 行的配置,就是将相关的依赖工程以模块的形式聚合进来。
这些工程都需要在同一个工作空间下,才能用“../”类似的相对路径进行定位应用。
3. 构建
要对所有模块进行编译、测试、安装、发布的话,都可以直接右击 MvnSSHDemo 工程,选择 Run As→Maven clean→test→install→build.→build 等命令。
当选择 Maven install 命令后,Maven 会自动把整个工程打成 MvnSSHDemo.war 包,发布到 Tomcat 的 webapps 目录中。
同样,如果选择 Maven build… 命令,输入 deploy,单击 Run 按钮,在安装的 Archiva 私服上就可以浏览到所有的构件。
4.测试
启动 Tomcat,就可以开始测试操作了,只是请注意:前面有搭建 Archiva 私服的,如果这个私服在开发的时候启动着,并且私服就搭建在自己的计算机上,请将它关闭后再启动测试应用的 Tomcat,或者修改测试应用 Tomcat 的端口,否则会出现端口冲突异常。因为 Archiva 也用 Tomcat 服务器,默认端口就是 8080 系列的。
至此,我们在 Maven 上面基于 SSH 完成了一个用户的 CRUD 功能,中间还体现了项目的模块思想、面向接口编程思想和 Maven 的继承、聚合思想。