JavaWeb笔记之SSH(Struts2框架)

先简单介绍一下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 开发环境的构建

  1. 下载Sturts 2 库文件
    地址:
    http://struts.apache.org/downloads.html
    将相关的库文件添加到WEB-INF\lib 目录下:
    在这里插入图片描述

  2. 在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>
  1. 创建 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 应用的开发步骤

  1. 创建Action动作类
  2. 创建视图页面
  3. 修改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)

  1. 表达式
    表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要"做什么"。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种"链式"对象访问路径,还支持在表达式中进行简单的计算

  2. 根对象
    实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中对象,需要使用"#“号加上对象名称,即”#对象名称"的形式

  3. 上下文环境
    实际上OGNL的取值还需要一个上下文环境,设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"#“号加上对象名称,即”#对象名称"的形式

2.4 用法

  1. 访问对象的方法
    public void testOGNL(){
        //获得上下文环境Context
        OgnlContext context = new OgnlContext();
        //获得根对象Root
        Object root = context .getRoot();
        //执行表达式
        Object obj = Ognl.getValue("'helloWorld'.length()",context ,root);
    }
  1. 访问对象的静态方法
    public void testOGNL(){
        //获得上下文环境Context
        OgnlContext context = new OgnlContext();
        //获得根对象Root
        Object root = context .getRoot();
        //执行表达式 @类名@方法名
        Object obj = Ognl.getValue("@java.lang.Math@random()",context ,root);
    }
  1. 获取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);
    }
  1. 获取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>标签

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA开发区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值