- 浏览: 201550 次
- 性别:
- 来自: 包头
最新评论
-
chengeng:
图片没有显示。
登录系统-基于struts2+spring+hibernate分层架构 -
chengeng:
不知为什么,图片没有显示出来。
登录系统-基于struts2+spring+hibernateJPA分层架构 -
rdz09:
解析得很详细,不错
从头学起:struts2(1) -
zxd543:
图怎么都看不见呢?
登录系统-基于struts2+spring+hibernate分层架构 -
huweijie:
...
JAVA语言程序设计-第九章 异常处理
1、新建一个mysql数据库,并新建连接,数据库结构如下图所示:
2、新建一个项目,包结构如下图:
3、导入框架所需的jar文件,从下面网址下载:
http://ishare.iask.sina.com.cn/f/14550905.html?from=like&retcode=0
或:
http://download.csdn.net/detail/caozhongde1991/3496608
4、在book.model包中,由数据库生成实体类:
如果没有建好数据源,则需要新建数据源。
package book.model;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(name = "admin")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Admin.findAll", query = "SELECT a FROM Admin a"),
@NamedQuery(name = "Admin.findByUName", query = "SELECT a FROM Admin a WHERE a.uName = :uName"),
@NamedQuery(name = "Admin.findByUPass", query = "SELECT a FROM Admin a WHERE a.uPass = :uPass"),
@NamedQuery(name = "Admin.findByUId", query = "SELECT a FROM Admin a WHERE a.uId = :uId")})
public class Admin implements Serializable {
private static final long serialVersionUID = 1L;
@Size(max = 20)
@Column(name = "u_Name")
private String uName;
@Size(max = 20)
@Column(name = "u_Pass")
private String uPass;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "u_id")
private Integer uId;
public Admin() {
}
public Admin(Integer uId) {
this.uId = uId;
}
public String getUName() {
return uName;
}
public void setUName(String uName) {
this.uName = uName;
}
public String getUPass() {
return uPass;
}
public void setUPass(String uPass) {
this.uPass = uPass;
}
public Integer getUId() {
return uId;
}
public void setUId(Integer uId) {
this.uId = uId;
}
@Override
public int hashCode() {
int hash = 0;
hash += (uId != null ? uId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Admin)) {
return false;
}
Admin other = (Admin) object;
if ((this.uId == null && other.uId != null) || (this.uId != null && !this.uId.equals(other.uId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "book.model.Admin[ uId=" + uId + " ]";
}
}
5、新建持久性单元,persisternce.xml:
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="sshjPU" >
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>book.model.Admin</class>
<properties/>
</persistence-unit>
</persistence>
6、在book.idao包中,新建dao接口IBaseDao和IAdminDao:
为了应用程序的扩展,创建IBaseDao接口:
package book.idao;
import java.io.Serializable;
import java.util.List;
public interface IBaseDao<T,ID extends Serializable>{
void insert(T obj);
void update(T obj);
void delete(ID id);
T findById(ID id);
List<T> findAll();
List<T> findPage(int pageSize,int pageNo);
int findCount();
}
IAdminDao接口继承了IBaseDao接口:
package book.idao;
import book.model.Admin;
import java.util.List;
public interface IAdminDao extends IBaseDao<Admin,Integer>{
Admin findOne(String Name,String Password);
List<Admin> findPage(String Name,Integer pageSize,Integer pageNo);
Integer findCount(String Name);
}
7、在book.dao包中,实现dao接口IBaseDao和IAdminDao,创建类BaseDao和AdminDao:
为了应用程序的扩展,BaseDao类实现了大量有用的方法,注意添加事务标注@Transactional,实现事务注入。在private EntityManager em语句前添加标注@PersistenceContext,实现实体管理器的自动注入。
package book.dao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import book.idao.IBaseDao;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class BaseDao <T,ID extends Serializable> implements IBaseDao<T,ID>{
@PersistenceContext
private EntityManager em;
private Class<T> cls;
public BaseDao(Class<T> cls){
this.cls=cls;
}
@Override
public void insert(T obj){
em.persist(obj);
}
@Override
public void update(T obj){
em.merge(obj);
}
@Override
public void delete(ID id){
em.remove(findById(id));
}
@Override
public T findById(Serializable id){
if((T)em.find(cls,id)==null)
return null;
else
return (T)em.find(cls,id);
}
@Override
public List<T> findAll(){
return em.createQuery("select o from"+
cls.getSimpleName()+"as o").getResultList();
}
@Override
public List<T> findPage(int pageSize,int pageNo){
Query q=em.createQuery("select o from"+
cls.getSimpleName()+"as o");
q.setMaxResults(pageSize);
q.setFirstResult((pageNo-1)*pageSize);
return q.getResultList();
}
@Override
public int findCount(){
return ((Long)em.createQuery("select o from"+
cls.getSimpleName()+"as o").getSingleResult()).intValue();
}
//根据jpql查询一条记录
protected T findOne(String jpql,Object... values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
if((T)q.getSingleResult()==null)
return null;
else
return (T)q.getSingleResult();
}
//根据jpql分页查询多条记录
protected List<T> findPage(String jpql,int pageSize,int pageNo,Object...values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
q.setMaxResults(pageSize);
q.setFirstResult((pageNo-1)*pageSize);
return q.getResultList();
}
//根据jpql不分页查询多条记录
protected List<T> find(String jpql,Object...values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
return q.getResultList();
}
//根据jpql查询前num条记录
protected List<T> findTopByNum(String jpql,int num,Object... values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
q.setMaxResults(num);
return q.getResultList();
}
//根据jpql查询记录总数
protected int findCount(String jpql,Object... values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
return ((Long)q.getSingleResult()).intValue();
}
//根据jpql执行更新或删除,返回被影响的记录总数
protected int excute(String jpql,Object...values){
Query q=em.createQuery(jpql);
for(int i=0;i<values.length;i++){
q.setParameter(i+1, values[i]);
}
return q.executeUpdate();
}
}
8、在book.iservice包中,新建业务逻辑接口IAdminService:
本接口也是为了扩展,添加了许多方法的定义。
package book.iservice;
import book.model.Admin;
import java.util.List;
public interface IAdminService {
void addAdmin(Admin admin);
void deleteAdmin(Integer Id);
Admin findAdminById(Integer Id);
Admin findAdmin(String Name,String Password);
List<Admin> findAdminByPage(Integer pageSize,Integer pazeNo);
Integer findCount(String Name);
}
9、在book.service包中,实现业务逻辑接口IAdminService,创建类AdminService:
类AdminService中采用标注@Autowired,对private IAdminDao iAdminDao;进行自动注入。
package book.service;
import book.idao.IAdminDao;
import book.iservice.IAdminService;
import book.model.Admin;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
public class AdminService implements IAdminService{
@Autowired
private IAdminDao iAdminDao;
@Override
public void addAdmin(Admin admin) {
iAdminDao.insert(admin);
}
@Override
public void deleteAdmin(Integer custId) {
iAdminDao.delete(custId);
}
@Override
public Admin findAdminById(Integer custId) {
return iAdminDao.findById(custId);
}
@Override
public Admin findAdmin(String Name, String Password) {
return iAdminDao.findOne(Name, Password);
}
@Override
public List<Admin> findAdminByPage(Integer pageSize, Integer pazeNo) {
return iAdminDao.findPage(pageSize, pazeNo);
}
@Override
public Integer findCount(String Name) {
return iAdminDao.findCount(Name);
}
}
10、修改web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
11、添加applicationContext.xml文件,整合spring框架和hibernateJPA框架:
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--以下Service采用自动注入-->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!--在Dao层使用@PersistenceContext注入实体管理器-->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="sshjPU"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="generateDdl" value="true"/>
<property name="showSql" value="false"/>
</bean>
</property>
</bean>
<bean id="iAdminDao" class="book.dao.AdminDao"/>
<bean id="iAdminService" class="book.service.AdminService"/>
<bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory">
<ref bean="entityManagerFactory"/>
</property>
</bean>
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* book.service.*.*())"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="myTxManager">
<tx:attributes >
<tx:method name="add*" propagation="REQUIRES_NEW"/>
<tx:method name="edit*" propagation="REQUIRES_NEW"/>
<tx:method name="delect*" propagation="REQUIRES_NEW"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
</beans>
12、在WEB-INF文件夹下创建属性文件:jdbc.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/book?useUnicode=true&chracterEncoding=gbk
jdbc.username=root
jdbc.password=123456
13、创建UserAction.java,实现struts2架构的MVC,注意添加标注@Autowired,实现自动注入:
package book.action;
import com.opensymphony.xwork2.ActionContext;
import book.iservice.IUserService;
import book.model.Admin;
public class UserAction {
private String userName;
private String userPassword;
private String msg;
@Autowired
private IAdminService iAdminService;
public String execute()throws Exception{
Admin user=iuserService.findByUsernameAndPassword(userName, userPassword);
if(user!=null){
msg="登录成功!"+user.getUName();
ActionContext.getContext().getSession().put("user",user);
}else{
msg="登录失败!<a href=\"JavaScript:window.history.back()\">返回</a>";
}
return "msg";
}
public void setUserName(String userName){
this.userName=userName;
}
public void setUserPassword(String userPassword){
this.userPassword=userPassword;
}
public String getMsg(){
return msg;
}
}
14、配置struts.xml文件:
<struts>
<package name="book" extends="struts-default">
<action name="UserAction" class="book.action.UserAction">
<result name="msg">/index.jsp</result>
</action>
</package>
</struts>
15、创建如下两个页面:
Login.jsp:
<%@ page pageEncoding="gb2312" %>
<%@ page contentType="text/html; charset=gb2312" %>
<% request.setCharacterEncoding("gb2312"); %>
<%@ page language="java" %>
<html>
<head><title>登录网页</title></head>
<body>
<form method="POST" action="UserAction.action">
<table >
<tr>
<td width="890" align="left" colspan="2">
<b><font size="5">系统登录</font></b>
<hr>
</td>
</tr>
<% if (request.getAttribute("error") != null){ %>
<tr>
<td width=100% align=center colspan=4 height=36>
<font color=red><b><%=request.getAttribute("error")%></b></font>
</td>
</tr>
<%
}
%>
<tr>
<td width="75" align="center">
<p align="right">账号:</p>
</td>
<td width="809" align="center">
<p align="left">
<input type="text" name="userName" size="20"></td>
</tr>
<tr>
<td width="75" align="center">
<p align="right">密码:</p>
</td>
<td width="809" align="center">
<p align="left">
<input type="password" name="userPassword" size="20">
<input type="submit" value="登录" name="loginButton"></td>
</tr>
</table>
</form>
</body>
</html>
在这个页面中,下面的form标记语句:
<form method="POST" action="UserAction.action">
表示该页面提交一个名为:"UserAction"的action,注意和struts.xml文件中的action的name相对应。
index.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示信息</title>
</head>
<body>
<h1>Hello World!</h1>
<div id="content">
<center>
<br/><%=request.getAttribute("msg")%>
</center>
</div>
</body>
</html>
该页面的标记语句:
<%=request.getAttribute("msg")%>
表示接收来自action的msg字符串。
16. 生成项目,并运行http://localhost:8080/sshj/login.jsp
发表评论
-
确认对话框ConfirmDialog和选择对话框OptionDialog:猜数游戏
2012-04-07 18:22 30935确认对话框ConfirmDialog给出提示信息和若干 ... -
输入对话框showInputDialog综合应用:猜数游戏
2012-04-06 17:13 7246Java输入对话框共有6个重载方法showInputDi ... -
消息对话框MessageDialog综合应用:九九表
2012-04-01 23:39 22601java信息对话框:MessageDialog是一个非常 ... -
从头学起:struts2(1)
2011-12-15 23:10 1421从头学起:struts2(1)从页面跳转说起:先看一个例子,使 ... -
登录系统-基于struts2+spring+hibernate分层架构
2011-11-29 21:43 34551、创建mysql数据库,结构如下图所示: 2、 ... -
依赖注入入门-从dao到service
2011-11-23 18:30 8194在分层的web应用系统中,通常将数据操作分为dao数据层和se ... -
登录系统-基于struts2+hibernate分层架构
2011-11-21 23:07 296本实验使用struts+hibernate分层结构,目的是可以 ... -
登录系统-基于servlet+hibernate分层架构
2011-11-21 12:13 3224本实验使用servlet+hibernate分层结构,目的是 ... -
登录系统-基于struts2的分层架构
2011-11-19 21:48 28111.下载支持Netbeans7.0的Struts2插件,在工具 ... -
登录系统-基于servlet
2011-11-19 19:48 31751. 新建一个web项目,在项目中添加两个包:Ja ... -
登录系统-基于servlet+hibernate
2011-11-19 19:01 42131.新建一个java web项目,在步骤4中选择Hiber ... -
基于NetBeans7.0的Hibernate编程入门
2011-11-19 11:47 1541基于NetBeans7.0的 Hebernate入门 ... -
实验13 数据库的连接:JDBC*
2011-03-28 22:02 1278一、实验目的 了解JDBC核心API,利用JDBC核心API ... -
实验14 JSP与Servlet技术*
2011-03-28 22:01 1304一、实验目的 1. 理解JSP元素的概念 2. 理解JSP ... -
实验12 网络编程
2011-03-28 21:59 1248一、实验目的 1. 掌握InetAddress类的使用。 2 ... -
实验11 线程
2011-03-28 21:59 903一、实验目的 1. 线程 ... -
实验10 流与文件
2011-03-28 21:58 1023一、实验目的 1. 理解数据流的概念 2. 理解Java流的 ... -
实验 9 综合练习
2011-03-28 21:57 819一、实验目的 将所学知识进行综合运用,模仿设计具有实 ... -
实验 8 图形与多媒体处理
2011-03-28 21:56 936一、实验目的 熟悉图形、图像的使用方法,理解计算机动画 ... -
实验 7 建立图形用户界面
2011-03-28 21:54 1409一、实验目的 了解图形用户界面基本组件窗口、按钮、文本 ...
相关推荐
Struts1、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决了一部分问题,而将它们整合在一起,可以构建出高效、灵活的企业级应用程序。这里我们主要探讨这三者整合时所需的核心jar包以及它们的功能。 ...
Struts2、Spring、Hibernate和MySQL是Java Web开发中常用的技术栈,它们组合起来可以构建一个功能完善的权限管理系统。下面将分别介绍这四个组件及其在权限管理中的应用。 1. **Struts2**:Struts2是一个基于MVC...
Struts 2.3.24.1、Spring 4.2.1 和 Hibernate 5.0 是三个在 Java 开发领域中广泛使用的开源框架,它们分别负责 Web 应用的 MVC(Model-View-Controller)架构、依赖注入与服务管理以及对象关系映射(ORM)。...
SSH是三个流行开源框架的缩写,分别是Struts2、Spring和Hibernate,它们常被用于构建企业级Java Web应用程序。这个压缩包包含了这三个框架的特定版本:Struts2.3.37、Spring Framework 5.1.0以及Hibernate Release ...
Struts2、Spring和Hibernate是Java企业级开发中三大核心框架,它们的集成通常被称为SSH(Struts2、Spring、Hibernate)整合。本实例将详细讲解如何将这三个框架与Oracle数据库进行整合,以构建一个完整的Java Web...
Struts 2、Spring 和 Hibernate 是 Java Web 开发中三个重要的框架,它们分别负责MVC模式中的动作控制、依赖注入及持久化管理。这个压缩包文件"struts-2.3.1+spring3.1.1+hibernate3.6.9整合&配置文件"提供了将这三...
Struts2.3.4、Spring3.1.1和Hibernate4.1.0是三个在Java开发领域中广泛使用的开源框架,它们分别是MVC框架、依赖注入框架和对象关系映射工具。这个集成项目(prj_mgr_04_ssh2)的目标是将这三个框架协同工作,以构建...
整合Struts2、Spring和JPA,可以实现MVC架构的完整流程:Struts2负责接收用户请求,通过Action处理业务逻辑,Spring管理这些Action对象以及数据访问层,JPA则处理与数据库的交互。这样的组合提供了良好的分层结构,...
### Struts2 + Spring3.x + JPA1.0框架整合步骤详解 #### 一、引言 随着软件工程的发展,MVC(Model-View-Controller)架构模式因其清晰的分层逻辑而在Web开发领域中得到了广泛的应用。本文将详细介绍如何整合...
【标题】"简单的spring2+struts2+hibernate3.2+jbpm3应用框架"揭示了一个经典的Java企业级开发架构,该框架整合了四个核心组件:Spring 2.x、Struts 2.x、Hibernate 3.2以及jBPM 3。这些技术在2000年代末到2010年代...
SSH(Struts2、Hibernate和Spring)是一种流行的Java企业级应用程序开发框架的组合,用于构建高效、可维护的Web应用。下面将详细介绍如何整合Struts2.2.1、Hibernate3.6和Spring3.0.5。 首先,确保准备好所有必要的...
SSH整合是指将Spring、Struts2和Hibernate三个开源框架集成在一起,用于构建高效、模块化的企业级Web应用程序。这三个框架分别负责不同的职责:Spring作为应用的基石,提供依赖注入(DI)和面向切面编程(AOP)等...
这三者结合使用,通常称为SSH(Struts2-Spring-Hibernate)架构,能够构建出完整的、基于MVC模式的Java Web应用程序。开发者可以利用Struts2处理用户请求,Spring4管理业务逻辑和服务层,而Hibernate4则负责数据持久...
标题和描述中提到的"hibernate3.3.2+spring2.5.6+struts2.1.6整合包+anntations"是指一个经典的Java Web开发框架集成,通常被称为SSH(Struts2、Spring、Hibernate)框架。这个整合包包含这三个组件的特定版本,用于...
在IT行业中,SSH(Spring、Struts和Hibernate)是一个经典的Java Web开发框架组合,被誉为“老三架马车”。这三种技术的整合可以构建出高效、灵活且易于维护的Web应用。下面将详细介绍SSH整合的方法及其相关知识点。...
Struts2、Hibernate和Spring是Java开发中三大主流框架,它们的集成是企业级Web应用开发的常见模式,能够帮助开发者高效地构建可维护、可扩展的系统。下面将详细介绍这三个框架以及它们集成的关键点。 Struts2是MVC...
1. **分层架构**:Spring负责业务逻辑层,Hibernate处理数据持久化,Struts管理用户交互,形成了清晰的职责划分。 2. **松耦合**:Spring的DI使各个组件之间解耦,增强了系统灵活性。 3. **事务管理**:Spring提供了...
Spring、Hibernate和Struts是Java Web开发中的三大框架,它们分别负责不同的职责,共同构建了一个高效、灵活的应用架构。在本实例中,我们将探讨如何将这三个框架整合到一起,实现一个完整的Web应用。 Spring框架是...
尽管本书主要关注Struts2与Spring的整合,但作者也提到了如何将这两者与其他框架(如Hibernate或JPA)结合起来。这种整合通常涉及以下几个步骤: 1. **Spring整合Web层**:使用Spring管理Struts2的Action实例。 2. ...
- **核心概念**:Struts2是基于拦截器的MVC框架,提供了一种分层的架构,允许开发者通过配置或注解来控制应用程序的行为。 - **Action类**:处理用户请求的中心组件,通常对应于一个HTTP请求,负责业务逻辑的执行...