马士兵 Struts2 视频内容

本文深入探讨了Struts2框架的各个方面,包括配置方法、开发模式设置、路径问题解决方案、动态方法调用、通配符使用技巧等核心内容,并介绍了如何进行简单的数据验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.5h

v1: 讲解了目录

v2 :简历web project

v3 :配置,copy struts3源码中的例子,blank

v4:简单配置,得到输出的/hello.action 、/hello 输出相同

v5:习惯


0.5h

v6  

1,定义开发模式,对project进行修改之后不用重新deploy,  在web.xml

 

 下面是4个开发模式常用配置的简介---
    <!-- 开启使用开发模式,详细错误提示 -->
    <!-- <constant name="struts.devMode" value="true"/>-->
    <!-- 指定每次请求到达,重新加载资源文件 -->
    <!-- <constant name="struts.i18n.reload" value="true"/>-->
    <!-- 指定每次配置文件更改后,自动重新加载 -->
    <!-- <constant name="struts.configuration.xml.reload" value="true"/>-->
    <!-- 指定XSLT Result使用样式表缓存 -->
    <!-- <constant name="struts.xslt.nocache" value="true"/>-->

2、建立jar文件对于的源码,以及doc文件(API文档)ruts.devMode" value="true"/>-->
v7 web.xml 自动补齐功能的配置
v8 运行机制
v9 运行机制,可以参考图Struts2.jude
 v10 
拷贝项目注意事项;
import项目的注意事项
 
v11
  具体视图的返回可以由用户自己定义的Action来决定
具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容
具体Action的实现可以是一个普通的java类,里面有public String execute方法即可
或者实现Action接口
不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法
v12
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
index.jsp 
虽然可以用redirect方式解决,但redirect方式并非必要。 
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径) 
或者使用myeclipse经常用的,指定basePath

v13
Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法 也可以在url地址中动态指定(动态方法调用DMI)(推荐)
添加用户 <a href="<%=context %>/user/userAdd">添加用户</a>
添加用户 <a href="<%=context %>/user/user!add">添加用户</a>


前者会产生太多的action,所以不推荐使用
http://localhost:8080/Struts2_0500_ActionMethod/user/userAdd
    <package name="user" extends="struts-default" namespace="/user">
        <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>
        
 
http://localhost:8080/Struts2_0500_ActionMethod/user/user!add
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>
    </package>
 
v14
使用通配符,将配置量降到最低
添加学生 删除学生 
不过,一定要遵守"约定优于配置"的原则 
添加老师 删除老师 添加课程 删除课程
    <package name="actions" extends="struts-default" namespace="/actions">
         <!--   可以将add和delete简化为下面一个action-->
        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
            <result>/Student{1}_success.jsp</result>
        </action>
        
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>
    </package>
v15   http://blog.youkuaiyun.com/mengxiangyue/article/details/7438679
我们就可以在页面中直接使用这样的方法传递参数了:<a href="user/user!add?name=a&age=8">。这里使用的连接的方式,我们也可以改成使用表单。使用这样的方式,struts会自动将传递过来的参数值赋值给对应的属性。

v16 ModelDriven,用得较少,但体现出基本的MVC模式。

v17 
action 属性,domian model, dto,   modelDriven,三种接受参数的方法。
其中第二种最多使用。
讲解了查看struts docs.
v18 
版本问题
 v19     
简单数据验证
public String add() {
		if(name == null || !name.equals("admin")) {
			this.addFieldError("name", "name is error");//加入value stack;
			this.addFieldError("name", "name is too long");
			return ERROR;
				return SUCCESS;
	}
取值方法
<s:property value="errors.name[0]"/>
 关于property :http://hamlzf.iteye.com/blog/1669490
有关于值栈的问题:Struts ValueStack Debug

v20 
<default-action-ref name="index"></default-action-ref>
    	<action name="index">
    		<result>/default.jsp</result>
    	</action>
简单数据验证
v21
 为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。
所以,在struts中的HttpservletRequest 的map值会复制到JSP中的httpRequst
V22 
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
<ol>
	<li>前三者:依赖于容器</li>
	<li>前三者:IOC</li> (只用这种)
	<li>后三者:依赖于容器</li>
	<li>后三者:IOC</li>
</ol>
v23 
v24  默认action ,可以用为设置为默认主页
<default-action-ref name="index"></default-action-ref>
    	<action name="index">
    		<result>/default.jsp</result>
    	</action>

v25
action总结

v26   小补充
v27  result type
	    <action name="r1">
	    	<result type="dispatcher">/r1.jsp</result>服务器端跳转
	    </action>
    <action name="r2">
    <result type="redirect">/r2.jsp</result>客户端跳转
   </action>    
   <action name="r3">
    <result type="chain">r1</result>
   </action>    
   <action name="r4">
    <result type="redirectAction">r2</result>
   </action>
v28 result type 补充
http://blog.youkuaiyun.com/calvex880714/article/details/8958019 


 

### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值