Struts2学习之处理结果

在最开始的《 Struts2学习之初见Struts2 》这篇文章中,也简单的说了说struts2中如何给请求者发送响应内容。这篇文章就对struts2中到底是如何处理响应结果进行详细的总结。

通过前面的文章,我们知道Action只是Struts2控制器的一部分,所以它不能直接生成对浏览器的响应。Action只负责处理请求,负责生成响应的视图组件,通常就是JSP页面,而Action会为JSP页面提供显示的数据。当Action处理用户请求结束后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图呈现给浏览者。

关于浏览者、控制器和视图资源之间的时序图如下:

如上图所示,Action处理完用户请求后,并未直接将请求转发给任何具体的视图资源,而是返回一个代表逻辑视图的普通字符串,Struts2框架收到这个逻辑视图后,把请求转发到对应的视图资源,视图资源将处理结果呈现给用户。

通过返回一个代表逻辑视图的普通字符串,这样的设计将Action类和Struts2框架进行了解耦、分离,提高了更好的代码复用性。这就是在Struts2框架中处理结果的基本原理。

配置处理结果

控制器Action会返回一个代表逻辑视图的普通字符串,我们需要在struts.xml中将逻辑视图和物理视图进行映射,Struts2在struts.xml文件中使用 <result .../> 元素来配置结果,根据 <result .../> 元素所在位置的不同,Struts2提供了以下两种结果:

  • 局部结果:将 <result .../> 作为 <action .../> 元素的子元素配置
  • 全局结果:将 <result .../> 作为 <global-results .../> 元素的子元素配置

配置 <result .../> 元素时通常需要指定如下两个属性:

  • name:该属性指定所配置的逻辑视图名
  • type:该属性指定结果类型

下面就分别对如何配置局部结果和全局结果进行详细的总结。

配置局部结果

前面的文章中,在struts.xml中都是这样配置逻辑视图和物理视图之间的映射的:

<action name="login" class="com.jellythink.practise.LoginAction">
    <result name="default">/default.jsp</result>
</action>

上面的这种写法使用了最简单的形式,使用了很多默认的值,如果写完整了,它应该是这个样子的:

<action name="login" class="com.jellythink.practise.LoginAction">
    <result name="success" type="dispatcher">
        <param name="location">/success.jsp</param>
    </result>
</action>

这才是最繁琐,最原始的写法;既指定了需要映射的逻辑视图名(success),也指定了结果类型(dispatcher),并使用子元素的形式来指定实际视图资源。

对于上面使用 <param .../> 子元素配置结果的形式,其中 <param .../> 元素用于配置一个参数,与所有配置参数的地方相似,配置参数需要指定参数名和参数值。 <param .../> 元素配置的参数名由name属性指定,此处的name属性可以取如下两个值:

  • location:该参数指定了该逻辑视图对应的实际视图资源
  • parse:该参数指定是否允许在实际视图名字中使用OGNL表达式,默认值true。

由于不同的结果类型可以配置不同的参数,具体的请参见 这里 。那么为什么这么繁琐的写法可以简化成那么简单的写法呢?

在配置处理结果时,如果配置 <result .../> 元素时没有指定location参数,系统将会把 <result ...> ... </result> 中间的字符串当成实际视图资源;如果没有指定name属性,则name属性采用默认值:success;如果没有指定type属性,则采用Struts2的默认结果类型。基于此,我们就可以写出最简单的形式。

配置全局结果

如果将 <result .../> 元素配置在 <global-results .../> 元素中,那么该 <result .../> 元素就配置了一个全局结果,全局结果将对所在包中的所有Action都有效。例如以下配置代码:

<package name="lee" extends="struts-default" namespace="/Login" >
    <!--定义全局结果-->
    <global-results>
        <result name="error">/error.jsp</result>
    </global-results>
    <action name="login" class="com.jellythink.practise.LoginAction" />
</package>

虽然在 <action .../> 中没有配置任何的 <result .../> ,由于配置了全局结果,所以这并不会妨碍系统的运行。

如果一个Action里包含了与全局结果里同名的结果,则Action里的局部Result会覆盖全局的Result。也就是说,当Action处理用户请求结束后,首先会在本Action里的局部变量里搜索逻辑视图对应的结果,只有在Action里的局部结果里找不到逻辑视图对应的结果,才会到全局结果里搜索。

总结

到这里就总结的差不多了,关于Struts2处理结果的学习,后面还有很多篇文章的,这里只是一个开始了。后面的文章再见。

深度学习是机器学习一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值