先简单介绍一下SSH框架
SSH是struts+spring+hibernate的一个集成框架,是目前比较流行的一种web应用程序开源框架。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,来帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。具体实现是用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的Dao(Data Access Object)接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring做管理。
一、Struts 2 框架简述
Struts2框架是用来替代servlet和jsp, 他的功能就是访问服务器的请求。
1.1 Struts 2 框架的组成
Struts 2框架实现了MVC模式。其中,模型(Model)表示业务和数据库代码,视图(View)表示页面设计代码,控制器(Cotroller)表示导航代码。所以这些使Struts 2 成为构建Java Web 应用的基本框架。
- 控制器:控制器由核心过滤器StrutsPrepareAndExecuteFilter、若干拦截器和Action组件实现。
- 模型:通常由JSP页面实现,也可以由Velocity Template、FreeMarker或其他表示层技术实现。
- 配置文件:Struts 2框架提供了一个名为struts.xml 配置文件,使用它来配置应用程序中的组件。
- Struts 2 标签:Struts 2 提供了一个功能强大的标签库,该库提供了大量标签,使用这些标签可以简化JSP页面的开发。
Struts 2 的MVC架构:
在控制器组件、业务逻辑组件以及视图组件之间没有代码上的联系,它们之间的关系都是在配置文件struts.xml 中声明的,这就保证了Web应用程序的可移植性和可维护性。
1.2 Struts 2 开发环境的构建
-
下载Sturts 2 库文件
地址:
http://struts.apache.org/downloads.html
将相关的库文件添加到WEB-INF\lib 目录下:
-
在web.xml中添加过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 创建 struts.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="basicstruts2" extends = "struts-default" namespace="/">
<action name="index">
<result>/index.jsp</result>
</action>
</package>
</struts>
constant 元素:用来定义常量或覆盖default.properties文件中定义的常量。
package 元素:用来把动作组织成不同的包(package)。
action 元素:用来定义一个动作。
result 元素:用来指定结果类型,即定义在动作完成后将控制权转到哪里。
1.3 Struts 2 应用的开发步骤
- 创建Action动作类
- 创建视图页面
- 修改struts.xml配置文件
二、OGNL
2.1 简介
OGNL(Object-Graph Navigation Language)的全称是对象图导航语言,它是一种功能强大的开源表达式语言,比EL(只能从域或内置对象中)表达式更强大,使用这种表达式语言,可以通过某种表达式语法,OGNL可以存取Java任意对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。
Struts2的默认表达式语言就是OGNL
2.2 作用
1.支持对象方法调用 objName.methodName()
2.支持类静态方法调用和值访问 @java.lang.String@format(‘name’,‘mark’)
3.支持赋值操作和表达式串联 price=100,calculatePrice()
4.支持访问OGNL上下文(OGNL context)和ActionContext
5.支持操作集合对象
2.3 要素(表达式、根对象、上下文环境)
OGNL的操作实际上就是围绕着OGNL结构的三个要素而进行的,分别是表达式(Expresssion)、根对象(Root Object)、上下文环境(Context)
-
表达式
表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要"做什么"。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种"链式"对象访问路径,还支持在表达式中进行简单的计算 -
根对象
实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中对象,需要使用"#“号加上对象名称,即”#对象名称"的形式 -
上下文环境
实际上OGNL的取值还需要一个上下文环境,设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"#“号加上对象名称,即”#对象名称"的形式
2.4 用法
- 访问对象的方法
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//获得根对象Root
Object root = context .getRoot();
//执行表达式
Object obj = Ognl.getValue("'helloWorld'.length()",context ,root);
}
- 访问对象的静态方法
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//获得根对象Root
Object root = context .getRoot();
//执行表达式 @类名@方法名
Object obj = Ognl.getValue("@java.lang.Math@random()",context ,root);
}
- 获取Root中数据(不需要加#)
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//向root传入Java对象
context.setRoot(new User("mark", 15));
//获得根对象Root
Object root = context .getRoot();
//执行表达式 获取对象中属性值
Object username = Ognl.getValue("username",context ,root);
Object age = Ognl.getValue("age",context ,root);
}
- 获取Context中的数据(需要加#)
public void testOGNL(){
//获得上下文环境Context
OgnlContext context = new OgnlContext();
//获得根对象Root
Object root = context .getRoot();
//向Context传入值
context.put("username","mark");
//执行表达式 获取Context中属性值
Object username = Ognl.getValue("#username",context ,root);
}
三、Struts2 常用标签
Struts2有一个标签库,里面预定义了非常多的标签供我们开发者使用,首先在页面使用以下代码引入标签库:
<%@ taglib prefix="s" uri="/struts-tags"%>
Struts2的标签一共分为四大类
3.1 逻辑控制类标签
3.1.1 条件标签:
用于执行基本的条件流转
<c:if>拥有一个test属性,其表达式的值用来决定标签里的内容是否显示。
<s:if test="#request.username=='eric'">
一点教程网
</s:if>
<s:elseif test="#request.username=='jack'">
www.yiidian.com
</s:elseif>
<s:else>
欢迎一起学习IT技术
<s:/else>
3.1.2 迭代标签:
用于遍历集合或者枚举值类型的对象。
value属性表示集合或枚举对象,status属性表示当前循环的对象,在循环体内部可以引用该对象的属性。
<s:iterator value="userList" status="user">
姓名:<s:property value="user.userName" />
年龄:<s:property value="user.age" />
</s:iterator>
3.1.3 组合标签:
用于将多个枚举值对象进行叠加,形成一个新的枚举值列表,如将3个列表对象进行了组合,形成新的列表对象。
<s:append var="newIteratorList">
<s:param value="%{myList1}" />
<s:param value="%{myList2}" />
<s:param value="%{myList3}" />
</s:append>
3.1.4 分割标签:
用于将一个字符串进行分割,产生一个枚举值列表,下面的代码将分割成三个字符串,然后输出。
<s:generator val="%{'aaa,bbb,ccc'}">
<s:iterator>
<s:property />
</s:iterator>
</s:generator>
3.1.5 合并标签:
用于将多个枚举值按照数组的索引位置进行合并。
<s:merge var="newMergeList">
<s:param value="%{mylist1}">--假设mylist1列表中有a,b,c三个元素
<s:param value="%{mylist2}">--假设mylist2列表中有1,2,3三个元素
</s:merge>
合并后新的列表的元素及其顺序为:a,1,b,2,c,3
可以使用以下代码输入
<s:iterator value="%{#newMergeList}">
<s:property />
</s:iterator>
3.1.6 排序标签:
用于对一组枚举值进行排序,属性comparator指向一个继承java.util.Comparator的比较器,该比较器可以是对action页面中的一个比较器变量,source指定要排序的列表对象。
<s:sort comparator="myComparator" source="myList">
<s:iterator>
<s:property value="..."/>
</s:iterator>
</s:sort>
3.1.7 子集标签:
用于取得一个枚举列表的子集。
source用于指定检索的列表对象,start用于指定起始检索的索引位置,count用于指定检索的结果输数量,decider属性必须是一个org.apache.struts2.util.SubsetIteratorFilter.Decider类的子类实例,用以指定检索的条件。例如在Action中提供了以下方法用来取得一个Decider对象:
public Decider getDecider(){
return new Decider(){
public boolean decide(Object element) throws Exception{
int i=((Integer)element).intValue();
return (((i%2)==0)?true:false);
}
};
}
然后引用该对象筛选子集:
<s:subset source="myList" decider="decider">
</s:subset>
或者不使用Decider对象:
<s:subset source="myList" count="13" start="3">
</s:subset>
3.2 数据输出类
数据输出标签用以输出页面中的元素、属性、隐含变量等,即包括静态文本的输出,也包括Struts2集成的各种变量的输出。
3.2.1 链接标签:
用于创建一个<a>
标签,errorText用于显示错误信息,priInvokeJS表示该链接执行时的JavaScript提示函数href表示跳转地址。
<s:a errorText="删除错误" preInvokeJS="confirm('确认删除?')" href="test.jsp">
<img src="/image/delete.gif" />
</s:a>
3.2.2 action标签:
可以直接调用action类中的函数,前提是该action类在Struts.xml中有定义,name属性用于指向映射文件中配置的action函数,excuteResult是否执行结果集的跳转。
<s:action name="LoginAction" executeResult="true" />--表示执行LoginAction的默认处理方法execute()
<s:action name="LoginAction!login" executeResult="true" />--表示执行LoginAction的处理方法login()
3.2.3 JavaBean标签:
用于创建一个JavaBean对象,name表示JavaBean类全名,var表示变量的实例名,并可以包含<s:param>设置实例化输入参数。
<s:bean name="xxx,xxx,xxx" var="xxx">
<s:param name="name" value="hzd" />--为该JavaBean的构造方法传递参数
</s:bean>
3.2.4 日期标签:
用以输出一个格式化的日期对象,name表示要输出的对象,format表示输出的日期格式。
<s:date name="user.birthday" format="dd/MM/yyyy" />
<s:date name="user.birthday" format="%{getText('some.i18n.key')}" />
<s:date name="user.birthday" />--默认格式
3.2.5 引用资源文件标签:
用于加载资源包到值栈,它可以允许<s:text>标签访问任何资源包的信息,而不只是当前action相关联的资源包。name属性用以指定资源包的类路径。
<s:i18n name="com.yiidian.ApplilcationMessages">
<s:text name="HelloWord" />
</s:i18n>
3.2.6 包含页面标签:
用来包含一个Servlet的输出(Servlet或JSP页面),使用value属性指定包含页名称,可以使用。
<s:include value="/test.jsp">
<s:param name="username">www.yiidian.com</s:param>--参数username=www.yiidian.com给test.jsp页面
</s:include>
3.2.7 传递参数标签:
用来为其他标签提供参数,所以一般是嵌套在其它标签的内部,name属性用来指定参数名称,value(可选)属性用来指定参数值。
<s:param name="username" value="www.yiidian.com" />--这种方式的参数值会以String格式放入stack
<s:param name="username">www.yiidian.com</s:param>--这种方式的参数值会以Object的格式放入stack
3.2.8 值栈标签:
用以加入一个值到值栈中。
<s:push value="user">
<s:property value="name" />--为user指定name属性
<s:property value="age" />--为user指定age属性
</s:push>
3.2.9 变量赋值标签:
赋予变量一个特定范围内的值,name属性表示变量的名字,scope表示变量的作用域(application.session.request.page.action),value变量的值。
<s:set>
3.2.10 国际化标签:
用于输出国际化信息,name属性指定国际化资源文件中消息文本的key,可以与<s:i18n>标签结合使用
<s:text name="HelloWord" />--它会按照一定的顺序查找资源文件,直到找到定义HellowWord标签的资源文件为止
3.2.11 链接标签:
用于创建一个URL链接,并可以通过<s:param>标签提供request参数。
<s:url id="url" value="/test.jsp">
<s:param name="username">www.yiidian.com</s:param>
</s:url>
3.2.12 属性标签:
用以输出value属性的值,并拥有一个default属性,在value对象不存在时显示。escape属性为true,来输出原始的HTML文本。
<s:property value="getText('some.key')">
3.3 HTML表单类标签
3.3.1 s:form标签
<s:form> 标签用于呈现 HTML 语言中的表单元素
3.3.2 s:textfield和s:textarea标签
<s:textfield> 和 <s:textarea> 标签的作用比较相似,都用于创建文本框,其主要区别在于 <s:textfield> 创建的是单行文本框,而 <s:textarea> 创建的是多行文本框。二者的使用也比较简单,一般只需要指定其 label 和 name 属性即可。两个标签的用法如下所示。
<s:textfield label="用户名" name="username"/>
<s:textarea label="描述" name="description"/>
在上述两个用法中,name 属性用于指定单行/多行文本框的名称,在 Action 中,通过 name 属性即可获取单行/多行文本框的值。
此外,<textarea>
标签还可以通过 value 属性指定单行/多行文本框的当前值,通过 cols 和 rows 属性分别指定多行文本框的列数和行数。
3.3.3 s:password标签
<s:password>
标签用于创建一个密码输入框,它可以生成 HTML 中的 <input type="password"/>
标签。
需要注意的是,Struts2 的 <s:password>
标签与 HTML 的 标签也略有不同:<input type="password"/>
标签只要设置 value 属性就可以将 value 的属性值作为默认显示值;而 Struts2 的 <s:password>
标签除了要设置 value 属性值以外,还要设置 showPassword 属性值为 true。
3.3.4 s:radio标签
<s:radio>
标签用于创建单选按钮,生成 HTML 中的 <input type="radio"/>
标签
3.3.5 s:reset标签
<s:reset>
标签用于创建一个重置按钮,会生成 HTML 中的 <input type="reset"/>
标签,该标签的使用比较简单,其常用属性为 name 和 value。
3.3.6 s:submit标签
<s:submit>
标签主要用于产生 HTML 中的提交按钮,该表单元素中,可以指定提交时的 Action 对应的方法。该标签通常与 <s:form>
标签一起使用。
3.3.7 s:checkboxlist标签
<s:checkboxlist>
标签用于一次性创建多个复选框,用户可以选择创建零到多个复选框,它可以产生一组<input type="checkbox"/>
标签。
3.3.8 s:select标签
<s:select>
标签用于创建一个下拉列表框,它会生成 HTML 中的 <select>
标签。
3.3.9 s:optgroup标签
<s:optgroup>
标签用于生成选项组,通常作为 <s:select>
标签的子标签使用。由于在一个下拉列表框中可以包含多个选项组,所以 <s:select>
标签也能够包含多个 <s:optgroup>
标签。
3.3.10 s:file标签
<s:file>
标签用于创建一个文件选择框,它会生成 HTML 中的 <input type="file"/>
标签。
3.3.11 s:hidden标签
<s:hidden>
标签用于创建隐藏表单元素,它会生成 HTML 中的隐藏域标签 <input type="hidden"/>
。
3.4 HTML非表单类标签
主要用来输出各种错误和消息。
3.4.1 错误标签:
用以输出Action错误信息
<s:actionerror />
3.4.2 消息标签:
用以输出Action普通消息
<s:atcionmessage />
3.4.3 字段错误标签:
用以输出Action校验中某一个字段的错误信息或所有字段的错误信息
<s:fielderror />--输出所有字段的错误信息
<s:fielderror>
<s:param>username</s:param>--输出字段username的错误信息
<s:param>password</s:param>--输出字段password的错误信息
<s:fielderror>
3.4.4 DIV标签:
用以输出一个<div>
标签
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南