struts2-国际化资源

Facebook登录协议逆向实战:从加密参数到完整流程解析(附Python代码) 本文深入解析Facebook登录协议的逆向工程,重点拆解`lgndim`和`encpass`等加密参数的生成逻辑,并提供完整的Python实现代码。通过Base64解码和RSA加密技术,帮助开发者理解并实现Facebook登录流程,同时涵盖工程优化与安全实践。 阅读详情
今天学习的主要内容:国际化资源
一.首先回顾一下struts2 的搭建有三个步骤:
1.导入包;
2.配置web-inf下的xml文件;
3.把struts.xml放在src的目录下。

二.分析action和Action类
1.action:代表一个struts2 的请求。
2.Action类:能处理struts2请求的类(java文件,实质是:.class文件)
Action的特点:
》属性的名字必须遵JavaBeans属性名相同的命名规则。属性的类型可以是任意的,从字符串到非字符串(基本数据类型)之间数据转换可以自动发生。
》必带一个无参数的构造器,因为要通过反射构建需要类的实例。
》至少有一个struts在执行action时候调用的方法。
》同一个Action类可以包含多个action的方法。
》struts2会给每一个请求创建一个Action的实例,即Action不是单例的。

三.这里顺便插入一个小注意事项:
在<form action="" >中,若不写method,默认值为:method="get",所以几次出错的原因,没有改写默认的method的值。所以只要把method="post",就不会乱码。

四.Struts2国际化资源
》国际化资源的概念:为不同的国家语言提供对应的消息资源文件。
》Struts2框架会根据请求包中包含的locale加载对应的资源文件。
》通过程序代码取得资源文件指定的key对应的消息。
重点:
1.如何配置消息资源的文件?
2.页面和Action类中如何取得资源配置中的value的值?
3.如何通过超链接实现国际化资源的替换?

首先看第一点:如何配置资源文件
(1)Action范围资源文件的配置:直接可以写XXXXAction_zn_CN.properties,这里一定要注意是:Action_zn_CN.properties这样的格式必须写Action,规定的。
(2)包范围的资源文件:在包的根目录下创建。文件名也要强制:package_language_country.properties属性文件,
一旦建立,处于该包下的所有Action都可以访问该文件,注意:包范围资源文件的baseName就是package(小写的p),不是Action所在的包名。
(3)全局资源文件:命名方式:baseName_language_country.properties,这个全局的要通过常量方式配置。
在struts.xml中我们要:
<constant name="struts-custom.i18n.resources" value="baseName"/>
了解下国际化资源的加载顺序:距离当前的Action较近的将被优先加载。(只要明白这一点就可以了)

再来看下第二点:页面和Action类中如何取得资源配置中的value的值
(1)在Action类中,若Action实现了TextProvder接口,则可以调用其getText方法获取value值(通过继承ActionSupport的方式)
下面看一个例子:
在全局中写3个,一个是i18nAction.properties,一个是中文i18n_zh_CN.properties,一个是美国英文i18n_en_US.properties
Testi18nAction.properties资源文件内容如下:
username=UserName
password=PassWord
submit=Submit
time=Time:{0}
time2=Time:${date}

i18n_zh_CN.properties资源文件如下:
username=\u7528\u6237\u540D
password=\u5BC6\u7801
submit=\u63D0\u4EA4
time=\u65F6\u95F4\:{0}
time2=\u65F6\u95F4\:${date}

i18n_en_US.properties资源文件如下:
username=UserName
password=PassWord
submit=Submit
time=Time:{0}
time2=Time:${date}

然后在struts.xml中配置全局的,constant的详细配置过程:(<!---->是xml中的注释)
<!-- 配置国际化资源文件,找到i18n:路径项目中的web App Libraies>>strust2-core-2.3.28.jar>>org.apache.struts2>>
    下面注意观察找到default.properties>>然后ctrl+F查找i18n找到:
    “# struts.custom.i18n.resources=testmessages,testmessages2” 
    然后constant中:
    (i18n名字随意的可以是其他的,但是要跟写的.properties文件名对应)
    的name复制等号前面的:struts.custom.i18n.resources
    value的值:i18n
    -->
    <constant name="struts.custom.i18n.resources" value="i18n"></constant>
    <package name="default"  extends="struts-default">
        <action name="testi18n" class="com.atguigu.struts2.i18n.app.Testi18nAction">
            <result>/i18n.jsp</result>
        </action>
    </package>
这个例子的2个页面都在webroot下
一个是:
             index.jsp
内容:
<a href="testi18n">Test i18n</a>
二个是:il8n.jsp(在下面有讲解这个jsp页面的详细内容提示在这个地方:”再看页面中获取资源文件信息:il8n.jsp“)
然后在配置好的struts2的一个web项目中的src下创建如下图的包名和名字为testi18nAction.java文件
:
仔细看下面的代码注释和内容:
mport java.util.Arrays;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class Testi18nAction extends ActionSupport {
    /**
     * 这里要注意2个地方
     * 
     * 这是第一点:在建立这个类的时候 Testi18nAction可以直接去继承找到ActionSupport。
     * 
     * 第二点:静态的常量有2个,可以写第一个,并且写execute的时候可以直接写ex之后ctrl+/提示这个execute() 
     * 方法的重写。
     */
    private static final long serialVersionUID = 1L;
    //为了是页面访问time所以定义一个字段如下:
    //然后在execute方法中去实例化对象:
    //date = new Date()写出这个的get与set方法;
    private Date date = null;//定义一个全局变量Date类的date
    public Date getDate() 
    {
        return date;
    }
    public void setDate(Date date) 
    {
        this.date = date;
    }
    //
    @Override
    public String execute() throws Exception
    {
        /**
         * 在action中访问国际化资源文件的value值;
         * 为什么能访问这个值?
         * 因为这个类Testi18nAction继承ActionSupport,这个ActionSupport中有个getText(String key)方法实现国际化;
         * getText方法好像实现了一个接口?
         * 所以这个方法的返回值就是国际化资源的value的值;
         * 占位符的time:
         * String time = getText("time", Arrays.asList(new Date()));
         */
        String username = getText("username");//这一行代码就是获取资源配置中的value的值
        System.out.println(username);
        date = new Date();
        String time = getText("time", Arrays.asList(date));//这一行代码也是获取资源配置中的key,并赋值
        System.out.println(time);
        return SUCCESS;
    }
}
再看页面中获取资源文件信息:il8n.jsp
首先在设置UTF-8下面一行写:
<%@taglib prefix="s" uri="/struts-tags" %>
整体页面和注释如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 导入Struts2标签 -->
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'il8n.jsp' starting page</title>
  </head>
  <body>
          <!-- 打开debug的方法在jsp页面中要加上<%@taglib prefix="s" uri="/struts-tags" %>
          之后才可以
          打开网页之后我们点击打开debug可以知道栈顶部有一个:DefaultTextProvider,在他里面有许多的get方法。
          所以在下面的form表单下的第一个label="UserName" 可以改写成label="getText('username')"

          getText('username')这个是ognl表达式
          而label=“字符串值”,所以强制ognl包装解析:


          小结:一·所以有2种情况(默认的theme为xml情况):
          label="%{getText('username')}"(页面获取的第一种方式)
          1)用key属性 例如:<s:textfield name="username" key="username"></s:textfield>(页面获取第二种方式)
          2)用label属性<s:textfield name="username" label="%{getText('username')}"></s:textfield>

          下面的二·是theme是simple的情况(<s:text name="username"/>加在前面)
            <s:text name="username"/>:<s:textfield name="username" label="%{getText('username')}"></s:textfield>
             <s:submit key="submit" value="%{getText('submit')}"></s:submit>
          -->
          <s:debug></s:debug>
          <!-- label方式把label写死在标签里 ,但是可以访问资源文件-->
           <s:form action="" theme="simple">
           <!--
           二· 
           这里的表单主体默认是xml,若将主题换成theme="simple"
           则不会出现账号,密码的文字信息提示用户输入了,所以
           要加上<s:text name="username"/>,这个标签的作用也可访问国际化资源的value值
           所以在<s:textfield name="username" key="username"></s:textfield>
           前面,而submit也在simple的情况下也要ognl解析:
           <s:submit key="submit" value="%{getText('submit')}"></s:submit>
            -->
               <s:text name="username"/>:<s:textfield name="username" label="%{getText('username')}"></s:textfield>

           <!-- key直接上资源文件中的value的值 -->
               <s:text name="username"/>:<s:textfield name="username" key="username"></s:textfield>
               <s:text name="password"/>:<s:textfield name="password" key="password"></s:textfield>

               <s:submit key="submit" value="%{getText('submit')}"></s:submit><!-- 因为这里是struts2标签,所以要用ognl解析才可以 -->
           </s:form>

           <!-- 访问值栈里面的属性值:time=Time:{0}这样的形式,要param填充占位符-->
          
           <!-- date是值栈栈顶中的属性值,在servlet中已经获取了国际化资源Testi18nAction.java中;
           在 i18n_zn_CN.properties中或者在i18n_en_US.properties中可以直接获取值栈中的date
           time:${date}
           -->
            //这样的写发在资源文件中的样子是:time=Time{0}
          <s:text name="time">
                      <s:param value="date"></s:param>
           </s:text>
           <br>
            //这样写法在资源文件中time2=${date},这个date的来历是在testi18nAction.java中定义了这个date值
           <s:text name="time2"></s:text>
  </body>
</html>
如此,在Action范围的情况下如下图所示在Testi18nAction.java同级别目录下写3个test开头的文件,里面内容与上面的全局资源里一样,可以测试出加载资源文件的优先级(可以在这个三个值前面加一个"^0^"的符号测试):

Unity通过Vosk实现离线语音识别方法 以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。将Vosk的DLL文件(如libvosk.dll、vosk.dll等)放入Assets/Plugins文件夹中。通过以上步骤,你可以在Unity中实现一个简单的离线语音识别功能。音频格式:确保录音的音频格式与Vosk模型要求的格式一致(通常是16kHz、16bit单声道)。首先,你需要下载Vosk的语音识别模型。在Assets文件夹中创建一个Plugins文件夹,用于存放Vosk的DLL文件。打开Unity并创建一个新的项目。 阅读详情

相关推荐

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 166

struts2 国际化处理

<br />在struts2中需要做国际化的有:<br />jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化<br />在之前的例子中已经做过和国际化相关的例子了,在struts.xml中配置过<br /> <br /><br />view plaincopy to clipboardprint?<br /><constant name="struts.custom.i18n.resources" value="message"></constant>    <b

xiashan17的专栏 1520

深入解析DMR协议中的4-CPFSK调制技术与实现

本文深入解析了DMR协议中采用的4-CPFSK调制技术。该技术凭借其连续相位、恒包络的特性,在有限的12.5kHz信道带宽内实现了稳健的通信,有效对抗干扰并提升功放效率,是DMR数字对讲机清晰、稳定通信的核心保障。文章详细阐述了其原理、实现细节及在协议栈中的协同作用。

weixin_29306875的博客 230

AOP(面向切面编程)的基本概念和原理

日志记录是软件开发中一项重要的工作,它帮助开发人员了解系统的运行状态、排查问题以及进行性能分析。然而,将日志记录与业务逻辑混合在一起可能导致代码的臃肿,降低了代码的可读性和可维护性。在这种情况下,AOP可以提供一种优雅的解决方案。首先,我们需要定义一个日志记录的切面。这个切面包含了在业务逻辑执行前后记录日志的代码。// 在业务逻辑执行前记录日志// 在业务逻辑执行后记录日志事务管理是数据库操作中一个重要的方面,确保数据库操作的一致性和完整性。

jakelihua 2231

SpringBoot多线程查询实战-查询库中所有数据多线程实现

但是,在数据量较大且服务器资源足够的情况下,多线程方法通常能够显著提高查询效率。此外,由于它是同步执行的,没有利用并行处理的能力,所以在处理大量数据时可能会比较慢。这个方法采用了分页查询的方式,每次只获取一部分数据,从而避免了内存溢出的问题。然而,它也是同步执行的,没有利用多线程或并行处理的能力。如果每次分页查询的数据量仍然很大,或者需要查询的轮数很多,那么这种方法的效率可能仍然会受到限制。​ ​ ​在比较这三种方式的效率时,我们需要考虑几个关键因素:数据量的大小、查询操作的复杂性、以及并行处理的能力。

勇敢牛牛,不怕困难! 4809

FFmpeg音频转换避坑实录:为什么VOS的REC转MP3比WAV转MP3体积小一半?

本文深入解析了FFmpeg在VOS系统REC格式音频转换中的优化技巧,揭示了REC转MP3比WAV转MP3体积小一半的原因。通过分析REC格式的压缩特性、转码参数陷阱及FFmpeg调优方法,帮助开发者实现高效音频转换,显著降低存储成本。

weixin_30752699的博客 527

AOP——面向切面编程

AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。 OOP(Object Oriented Programming)面向对象编程,是一种编程思想,所以,AOP也是一种编程思想,只是他们两个是不同的编程范式。

m0_62912377的博客 1万+

SA8295P QNX主机上电启动流程分析

嵌入式系统的启动过程对于确保系统正常运行至关重要。本文将详细分析SA8295P芯片在QNX主机上的上电启动流程,并提供相应的源代码示例。嵌入式系统的启动过程对于确保系统正常运行至关重要。本文将详细分析SA8295P芯片在QNX主机上的上电启动流程,并提供相应的源代码示例。以下是一个SA8295P QNX主机上电启动流程分析。

CodeMaven的博客 1231

什么是面向切面编程(Aspect-Oriented Programming)

面向切面编程(Aspect-Oriented Programming)的缩写是AOP。在 Spring Framework 中,AOP 是一个常用的功能,特别适合于分离关注点、简化业务逻辑。

一起来研究langchain和langchain-chatchat 1832

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1276

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

AOP(面向切面编程)

切面(Aspect)是包含横切关注点逻辑的模块。它主要用于定义在哪些地方(切入点)应用哪些操作(通知)。在 Spring AOP 中,切面使用@Aspect注解来标记,并作为 Spring 管理的 Bean。@Aspect@Component// 这是切入点和通知的具体实现@Aspect:用来定义一个切面类。@Component:将这个切面类交给 Spring 容器管理。切面类一般使用@Component。

m0_73837751的博客 1万+

【图像去噪】论文精读:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising

论文题目:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising —— AKDT:用于有效图像去噪的自适应核膨胀Transformer图像去噪是一项基本但具有挑战性的任务,特别是在处理高分辨率图像和复杂的噪声模式时。大多数现有方法依赖于标准的 Transformer 架构,该架构通常计算复杂度高,并且对不同噪声水平的适应性有限。在本文中,我们介绍了自适应核膨胀Transformer(AKDT)

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1045

struts2里资源国际化的配置

struts里面的资源文件一共有三个范围,全局范围,package范围,Action范围,下面我们来大致了解下它们的配置和用法1.全局范围 首先,得在struts.xml里面配置一个常量  value指明全局资源文件的基名,比如若是上面这种配置的话,在src目录下建两个资源文件yuchao_en_US.properties(英文环境),yuchao_zh_CN.properti

路漫漫其修远兮,吾将上下而求索 851

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复习struts2之配置国际化全局资源文件、输出国际化信息

准备资源文件,资源文件的命名格式如下: baseName_language_country.properties baseName_language.properties baseName.properties 其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如: 中国大陆: baseName_zh_CN.prop

4990

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Struts2 资源配置文件国际化详解

Struts2 资源配置文件国际化 Struts2资源文件的命名规范:basename_language_country.properties Struts2国际化 如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。 对于简体中文的Locale,ResourceBundle搜索资源的顺序是: (1)baseName_zh_CN.class (2)base

Golden_lion的博客 3076

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Struts2配置国际化资源

1. 国际化的目标 1). 如何配置国际化资源文件 I. Action 范围资源文件: 在Action类文件所在的路径建立名为 ActionName_language_country.properties 的文件 II. 包范围资源文件: 在包的根路径下建立文件名为 package_language_country.properties 的属性文件,一旦建立,处于该包下的所有...

diaohuaizhi1261的博客 147

Struts1 和Struts 2 国际化全局资源

1.Struts1 资源全局国际化 1)准备好多个资源文件,目录如下:   注:application_en_US.propertion,格式是baseName-language-country.properties,一组资源文件的baseName必须相同。 baseName-language-country.properties文件中的内容格式如下(只是用不同的语言翻译一遍而已):

rj0801zxh的专栏 752

Struts2的国际化和访问资源文件的几种方式

资源文件的命名:basename_language_country.propertiesJAVA国际化如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。对于简体中文的Locale,ResourceBundle搜索资源的顺序是:(1)baseName_zh_CN.class(2)baseName_zh_CN.properties(3)baseName_zh.class(4

Ink_jay的专栏 2194

Struts2——UI标签、数据回显、资源国际化

文章目录一、UI标签1.1 含义1.2 使用1.2.1 默认主题1.2.2 设置主题二、数据回显2.1 按照正常思路写数据回显2.2 Struts2提供的数据回显2.3 checkboxlist标签三、资源国际化3.1 Servlet和Struts资源国际化区别3.2 Struts实现资源国际化3.2.1 写资源文件3.2.2 使用常量加载资源文件3.2.3 Struts标签使用国际化 一、UI标...

且行且珍惜 245

struts2如何调用国际化资源

struts2调用国际化资源有三种方式: 1.标签属性key的使用 例:&lt;s:textfield key="key"/&gt;   2.用&lt;s:text/&gt;调用国际化资源 例:&lt;s:text name="key"/&gt; *以上两种方式只能用在JSP页面里面   3.用getText()调用国际化资源 例:JSP页面中 &lt;s:textfield ...

zhouqiang128 159

struts2 访问国际化资源 <s:text>作为属性

保留全局级国际化信息资源文件。并在message.properteis中增加一个带有参数的国际化信息。  labela = labela in zh_CN     labelb = labelb,{0}   访问国际化信息  用标签来访问国际化信息,只需要在它的name属性上填入需要的key即可。下面,来看看它的其它的属性。  1:使用带参数的国际化信息 

Golden_lion的博客 3694

Struts2 国际化资源表达式用法

下面略述com.opensymphony.xwork2.ActionSupport.getText()方法public String getText(String aTextName)说明:Gets a messages based on a message key,or null if no message is foundParameters:aTextName-the resource b...

chongqingnantian的专栏 128

struts2资源国际化笔记

struts2资源国际化笔记 首先说一下资源文件的定义范围,分别是全局、包级和类级。 全局的命名方式不限制,只需要在struts.properties或struts.xml中指定即可,如,一般资源文件存放于classes目录下。 包级命名方式为package_language_country.properties,存放于包目录中。 类级也就是Action类级命名方式为actionName_

dream_1086的专栏 731

struts2国际化资源文件的编码转换总结

struts2国际化资源文件不再用native2ascii的方法,而是用eclipse中的一个插件,安装插件通过Eclipse中的软件升级(Software Update)就OK了,下面我们来看一下安装步骤吧: 1.展开Eclipse的Help菜单,将鼠标移到Software Update子项,在出现的子菜单中点击Find and Install; 2.在Install/Up...

sobigring的博客 215

struts2-19配置国际化全局资源文件、输出国际化信息

国际化:baseName_language_country.properties[一般跟struts.xml文件放在一起] baseName_language.properties baseName.properties 其中baseName时资源文件的基本名,可以自定义,蛋language和country必须时java支持的语音和国家。如: 中国大陆:baseName_zh_CN.prop

39660593的博客 839
上一篇: Struts2上课笔记
下一篇: 学习笔记1-java基础部分-面试
javaee3
博客等级 码龄11年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值