尚学堂马士兵struts2 课堂笔记(三)
19-20 简单数据验证
例如 前台jsp 及struts.xml
<a href="user/user!add?name=a" >添加用户</a>
<package name="user" extends="struts-default" namespace="/user">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
<result name="error">/user_add_error.jsp</result>
</action>
</package>
类中的add方法如下
public String add() {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
// this.addFieldError("name", "name is too long");
return ERROR;
}
return SUCCESS;
}
error.jsp如下
<body> User Add Error! <s:fielderror fieldName="name" theme="simple"/> <br /> <s:property value="errors"/> <s:debug></s:debug> </body>
大家看到了 addFieldError 这个方法
看看结果
显示错误的方式有两种 一种是struts内置的
s:fielderror
还有一种
<s:property value="errors"/>
大家看到了 第一种已经有了默认的格式 如果我们看看error的源代码会发现 那部分是段css代码
所以我们一般用第二种方式
可就是第二种也有问题 问题在于
这算个什么东西 其实大家看看dubug模式 就明白了 error是个数组
那就简单了
<s:property value="errors.name[0]"/>
这样一来显示的就是 干干净净的
name is error
如果我要加两个错误呢 去掉上面name is too long 的注释
运行 没有显示!!
又有问题 那name is too long呢?
<s:property value="errors.name[1]"/> 试试
21-22 访问web元素
不用想太多 主要记住下面这个方法
jsp部分代码如下
<form name="f" action="" method="post"> 用户名:<input type="text" name="name"/> 密码:<input type="text" name="password"/> <br /> <input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document.f.submit();" /> </form>
struts.xm
<package name="login" extends="struts-default" namespace="/login">
<action name="login2" class="com.bjsxt.struts2.user.action.LoginAction2">
<result>/user_login_success.jsp</result>
</action>
</package>
类如下
package com.bjsxt.struts2.user.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
//DI dependency injection
//IoC inverse of control
public String execute() {
request.put("r1", "requesttt");
session.put("s1", "sessionnn");
application.put("a1", "applicationnnn");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
user_login_success.jsp部分代码如下
<body>
User Login Success!
<br />
<s:property value="#request.r1"/> |<%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
<s:property value="#attr.a1"/><br />
<s:property value="#attr.s1"/><br />
<s:property value="#attr.r1"/><br />
<s:debug></s:debug>
<br />
</body>
先看
<s:property value="#request.r1"/>
和上面那个错误验证一样 都是property里拿数据 似乎不一样 有个#号 大家看看debug
不用说了吧
那底下这又是什么东西
<s:property value="#attr.a1"/><br /> <s:property value="#attr.s1"/><br /> <s:property value="#attr.r1"/><br />
attr会自动搜索request,session,application 看哪里有a1,s1,r1
不过作为开发者 我们应该知道每一个参数在什么位置里,所以还是不要用这个方法
上面的都没有什么技术含量
现在说说有的思想的东西
大家看到类里面的注释 依赖注入 控制反转了吧
好 我来解释一下
类里面有request 可是我们没有new它呀
那谁来初始化它呢?
大家看看那个类 它实现了requestaware接口 同时还有一个set方法
那咱们就可以说 其实是struts给我们注入了request 我们的类依赖于struts 所以"依赖注入"
那控制反转呢? 本来是你的事 交给别人来做 不就控制反转了嘛(额 这个解释有点牵强呀)
那下来就要谈的是 我们为什么要这么办?
ok 下来谈谈控制反转
Axe axe=new StoneAxe()
Axe axe=AxeFactory("stone");
@resource
Axe axe
上面有三种方式来初始化一个斧子
第一种 我们最熟悉 第二种是用来工厂类 第三种是spring的方式
谈谈第一种 那就是原始人 我要一把斧子 那我就得自己做
第二种 就是现代人了 我要一把斧子 就去找工厂 告诉它我要一把什么样的斧子(stone) 工厂就会给我一杯
第三种就牛x了 那是共产主义社会 我只要说 我需要一般斧子 社会(context)就会给我 甚至于我都不知道context是怎么给我的 这都不重要
重要的是 我有斧子了
我只是 使用者 我不关心斧子的生产
总而言之 言而总之 解耦
参考资料
轻量级Java EE企业应用实战(第3版) 李刚
23 模块包含
在struts.xml中加入include.....
<struts>
<constant name="struts.devMode" value="true" />
<include file="login.xml" />
</struts>
这又什么好处?
好处在于可以分模块开发
24默认action
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
这样一来在该namespace下 默认的action就是index
你敲localhost:8080/appname/就是进入的indexaction
你敲localhost:8080/appname/asdfd 它找不到对应的action 还会跳的index.action
尚学堂马士兵struts2 课堂笔记(三)的更多相关文章
- 尚学堂马士兵struts2 课堂笔记(一)
06_尚学堂马士兵_Struts2_Struts2_HelloWorld_5 <constant name="struts.devMode" value="true ...
- 尚学堂马士兵struts2 课堂笔记(四)
27 结果类型 主要就四种种 dispatch和rediret chain和drdirectaction <package name="resultTypes" namesp ...
- 尚学堂马士兵struts2 课堂笔记(二)
14通配符问题 其实这个问题看一个例子就ok <package name="actions" extends="struts-default" names ...
- 尚学堂马士兵Oracle教程笔记
检查Oracle安装 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba 然后,解除对scott用户的锁 alter user scott account ...
- Struts2学习笔记(三)——Action详解
Action是用于处理请求操作的,它是由StrutsPrepareAndExceuteFilter分发过来的. 1.Action的创建方式 1) POJO类(PlainOldJavaObjects简单 ...
- 马士兵 spring 视频笔记
课程内容 1. 面向接口(抽象)编程的概念与好处 2. IOC/DI的概念与好处 a) inversion of control b) dependen ...
- Struts2学习笔记三:深入Action
一:Action中获取参数值 在Servlet中,我们通过doGet()/doPost()方法中的参数,获取request/response对象,然后提取参数值: 处理请求结束后,有数据需要携带返回客 ...
- struts2学习笔记三
一.国际化概念(了解) 1.什么是国际化 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 2.什么需要国际 ...
- Struts2学习笔记三 访问servlet
结果跳转方式 转发 <!-- 转发 --> <action name="Demo1Action" class="cn.itheima.a_result. ...
随机推荐
- node之querystring模块
前言 querystring 模块提供了一些实用工具,用于解析与格式化 URL 查询字符串. 一.querystring.parse() 用于将一个查询字符串解析为JS 对象. const query ...
- 8.1 使用Python操作SQLite数据库
SQLite是内嵌在Python中的轻量级.基于磁盘文件袋额数据库管理系统,不需要安装和配置服务,支持使用SQL语句来访问数据库.该数据库使用C语言开发,支持大多数SQL91标准,支持原子的.一致的. ...
- 70. Climbing Stairs(easy, 号称 Dynamic Programming 天下第一题)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- C++ 实现俄罗斯方块
C++ 实现俄罗斯方块 一.实验介绍 1.1 实验内容 本节实验我们进行设计俄罗斯方块前的思路分析,以及介绍ncurses 库的使用方法. 1.2 实验知识点 C++ 编程基础 ncurses 库的使 ...
- 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别
1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...
- MySQL 字符串连接CONCAT()函数
MySQL字符串连接函数 使用方法:CONCAT(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串, ...
- PHP Libxml 函数
PHP Libxml 简介 Libxml 函数和常量与 SimpleXML.XSLT 以及 DOM 函数一起使用. 安装 这些函数需要 Libxml 程序包. 在 xmlsoft.org 下载 PHP ...
- java 里面保留字volatile及其与synchronized的区别
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议, ...
- Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手
Android图表库MPAndroidChart(一)--了解他的本质,方能得心应手 我们项目中经常会遇到一些统计图,比如折线图,线形图等,在一些运动健康类的App中尤其的常见,这画起来要命,我以前就 ...
- OpenCV+OpenGL 双目立体视觉三维重建
0.绪论 这篇文章主要为了研究双目立体视觉的最终目标--三维重建,系统的介绍了三维重建的整体步骤.双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维 ...