尚学堂 马士兵 struts_2视频教程  笔记心得

01_尚学堂马士兵_Struts2_Struts2简介及学习方法简介

讲的内容

Action

Result

常用配置文件

OGNL& ValueStack

Tags

类型转换、上传与下载、interceptor、防止重复提交

MVC思想深入剖析

源码解读

其它话题

校验框架 I18N   AJAX  FreeMaker

原来笔记流行的struts1和webwork(技术上要比struts1要牛,但是struts1技术差的反而比较流行,所以创业不需要技术练就的多么高超,应用和应变最重要。)

最终在struts2合在一块。使用了webwork的技术。

02_尚学堂马士兵_Struts2_Struts2_HelloWorld_1.avi

先将helloWorld的Action。

创建新项目时候

比他编译器5高,没有问题。

03_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi

指定Tomcat的目录,

指定JDK搭建开发环境

War文件可以直接解压

(拷贝jar包,复制struts.xml文件 此文件千万不要放在WEB-INF下面,应该放到src下面 ,默认会放过去 ),

2.1以上 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

2.0 是  dispatchFilter,稍加区别

在web.xml文件中:

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

其中<url-pattern>/*</url-pattern>

永远/*

不要写/*.do 或者 /*.action约定俗成用/*

04_尚学堂马士兵_Struts2_Struts2_HelloWorld_3.avi (1)

<!--<constant >:常量的配置 -->

<!--name="struts.devMode" value="true":当前是开发模式,改动配置文件会自动装载 默认是false-->

05_尚学堂马士兵_Struts2_Struts2_HelloWorld_5.avi

<!--命名空间 ---> action -->相应的处理类或页面 -->

<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">

<action name="hell" class="package + class xxxx">

<result>

/Hello.jsp

</result>

</action>

</package>

06_尚学堂马士兵_Struts2_Struts2_HelloWorld_5.avi

07_尚学堂马士兵_Struts2_Struts2_HelloWorld_6.avi

struts.xml不自动提示的解决办法: window--perferences-XML catalog---add---key Type="URI"  key="*.dtd"

alt+/  完成自动提示

08_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_1.avi

tomcat 接受请求;

交给对应web.xml文件,发现filter;

09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.avi

tomcat 接受请求;

交给对应web.xml文件,发现filter;

首先看namespace,对应到struts.xml

struts2的执行流程:

当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给那个WebApplication来处理,然后会读取它下面的web.xml配置发现有配置:

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>因为<url-pattern> 为/* 它会过滤所有的请求然后就交给filter类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter处理执行调用doFilter()方法,然后再方法中会读取struts-xml文件,根据用户请求的地址找到相应的package、 action、 result、然后将相应的页面返回给浏览器

Struts把请求和视图分开。

10_尚学堂马士兵_Struts2_Struts2_Namespace_命名空间.avi

(1)namespace决定了action的访问路径,默认为"",可以接收所有路径的action

namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,

/xxx/index.action,或者/xxx/yyy/index.action

namespace最好也用模块来进行命名

(2) package 在strtus2中作用和java一样,比如前台和后台相同的action,就不会冲突,在命名上,用来区分重名的情况。

(3) <result>标签如果没有指定name属性默认返回值为success

(4) namespace不写=namespace=””,都可以用交给为空的这个package的对应的action来处理。

复制项目ctrl+c   ctrl+v

右键property修改web下的webroot下的路径:

注意检查 JRE  SYSTEM  LIBRARY

11_尚学堂马士兵_Struts2_Struts2_Action.avi

(1)struts1 与struts2的一个重要区别:在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访问都会创建一个Action对象,所以struts2不会有线程安全问题的发生,struts2会new很多个action对象,struts1只有一个action,需要做很好的线程同步的功能。Struts2永远不会有线程同步的问题。

(2)<result>标签如果没有指定name属性默认返回值为success

(3)<action>标签中的class值如果没有配置相应的类,它会调用struts默认的一个处理类的execute()方法.

(4)实现struts的处理类的时候不要自己随便写类然后定义execute()方法,也不要实现Action类而要从ActionSupport类继承,可以直接使用它为我们定义好的方法.

(5)不配class,他会实现ActionSupport,来自于xwork的源码。

(6)写的action都尽量继承ActionSupport,企业开发尽量用这一种。

字符修改,由默认的iso-8859修改为:

兰德公司  描述 中国人 很冷漠  表情不够丰富  丰富起来 别冷漠  灵活机动。

12_尚学堂马士兵_Struts2_Struts2_Path_路径问题.avi

(1)struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。

虽然可以用redirect方式解决,但redirect方式并非必要。

解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)

或者使用myeclipse经常用的,指定basePath

(2)request.getContextPath()得到项目的名字,一般用来解决路径问题 如果项目为根目录,则得到一个"",即空的字条串。

request.getscheme()返回的协议名称.默认是http

request.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhost

request.getServerPort()获取服务的端口号

解决路径的问题——这种方式最为简单:

<head>

<base href="<%=basePath%>" />

</head>

13_尚学堂马士兵_Struts2_Struts2_ActionMethod_DMI_动态方法调用.avi

Action执行的时候并不一定要执行execute方法<br />

可以在配置文件中配置Action的时候用method=来指定执行哪个方法

也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />

<a href="<%=context %>/user/userAdd">添加用户</a>

<br />

<a href="<%=context %>/user/user!add">添加用户</a>

<br />

前者会产生太多的action,所以不推荐使用

配置文件:

<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>

<action name="user" class="com.bjsxt.struts2.user.action.UserAction">

<result>/user_add_success.jsp</result>

</action>

</package>

14_尚学堂马士兵_Struts2_Struts2_ActionWildcard_通配符配置.avi

主要学习通配符的使用  通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则

相对于DMI,在最终result的结果页面可以灵活的设置。

<package name="actions" extends="struts-default" namespace="/actions">

<action name="Student_add"></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>

</action>

</package>

说明:

(1){1}代表name="Student*"后面第一个'*',同理{2}代表第二个'*'

(2).如果action之间有重复配置,struts2会匹配最精确的action。如果通配符配置之间有重复,则看前后配置顺序。

15_尚学堂马士兵_Struts2_Struts2_用Action的属性接收参数.avi

在继承ActionSupport的类中定义要接受的参数,参数的名称与Action所传的名称无关在struts2内部调用的是属性的set方法,所以setxxx()的名字一定要与Action后面所传的值是一样的。

1.5 实现的接口不能写@override

1.6 实现的接口可以写@override

private String name; //成员变量  自己帮你转。

16_尚学堂马士兵_Struts2_Struts2_用DomainModel接收参数.avi

域模型,真正存在的实体的概念。

如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象例如:

private User user (set get 方法)在调用Action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递。(最常用的方式)

17_尚学堂马士兵_Struts2_Struts2_用ModelDriven接收参数.avi

泛型,不用做类型强制转换了。

public class UserAction extends ActionSupport implements ModelDriven<User>

继承ActionSupport类的处理类必须同时实现ModelDriven<Object>(实现getModel())在传值的时候使用user/user!add?name=bbb进入处理类的时候会调用getModel()方法返回User对象并且把传过来的值set到里面,注意:此时private User user = new User() 不能只定义,要同时实现这样getModel()才能拿到user对象。

18_尚学堂马士兵_Struts2_Struts2_2.1.6版本的中文问题.avi

在配置文件中加入:

<constant name="struts.i18n.encoding" value="GBK"/> 按照文档说明加入此句可解决中文乱码但是不行这是2.1.6的一个bug,会在下一个版本中修复 如何解决呢:在web.xml中:

<filter-name>struts2</filter-name>

<!--<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-->

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

把过滤器的版本改成老版本的即可解决该问题!

Struts2配置文件请参考api和 default.properties文件。

19_尚学堂马士兵_Struts2_简单数据验证_1.avi

使用addFieldError方法和s:fieldError标签简单处理数据校验

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;

}

在页面中显示错误信息:

<!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->

<s:fielderrorfieldName="name" theme="simple"/>

<!-- 从存储错误信息的Map中拿数据 -->

<s:property value="errors.name[1]"/>

20_尚学堂马士兵_Struts2_简单数据验证_1.avi

专门取Value stack和context 的值。

Map里面value是数组,内部的实现就是集合。

<!-- 显示详细的栈信息-->

<s:debug></s:debug>

栈: 后进先出

21_尚学堂马士兵_Struts2_访问Web元素_1.avi

注意:web.xml中关于struts的配置一定要采用2.1的,2.0的会取不到这是一个bug

(1)通过ActionContext对象取得Map类型的request, session, application HttpServletRequest, HttpSerletSessionServletContetext:

public class LoginAction1 extends ActionSupport {

private Map request;

private Map session;

private Map application;

//访问此方法,取得相应的对象但是是Map类型

public LoginAction1() {

request = (Map)ActionContext.getContext().get("request");

session = ActionContext.getContext().getSession();

application = ActionContext.getContext().getApplication();

}

//在Map类型的对象中存入相应的值

public String execute() {

request.put("r1", "r1");

session.put("s1", "s1");

application.put("a1", "a1");

return SUCCESS;

}

}

//在页面中通过标签取得存入的数据 二种方法(通过标签, 通过原始方式):

<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 />

我们存入Map中的数据居然可以在request,等对象中得到,那么在struts内部他是将Map中的数据全部复制到了request,session等对象中的 #attr ,可以取得所有的属性,但是不推荐使用,为了防止同名的情况,造成无法区别。

22_尚学堂马士兵_Struts2_访问Web元素_2.avi

上面是依赖容器的,依赖struts2. ActionContext.getContext()不是单例,而是threadlocal线程名字和存在里面的值。

(2)通过实现RequestAware,SessionAware, ApplicationAware 接口获取(最常用 和重要的一种)

DI  也称为IOC   dependency injection  依赖注入

Inverse of  control  控制反转

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", "r1");

session.put("s1", "s1");

application.put("a1", "a1");

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;

}

(3)通过ServletActionContext()取得真实的相应的对象

privateHttpServletRequest request;

privateHttpSession session;

privateServletContext application;

public LoginAction3() {

request = ServletActionContext.getRequest();

session = request.getSession();

application = session.getServletContext();

}

public String execute() {

request.setAttribute("r1", "r1");

session.setAttribute("s1", "s1");

application.setAttribute("a1", "a1");

return SUCCESS;

}

(4)通过实现ServletRequestAware接口获得相应的对象

privateHttpServletRequest request;

privateHttpSession session;

privateServletContext application;

public String execute() {

request.setAttribute("r1", "r1");

session.setAttribute("s1", "s1");

application.setAttribute("a1", "a1");

return SUCCESS;

}

@Override

public void setServletRequest(HttpServletRequest request) {

this.request = request;

this.session = request.getSession();

this.application = session.getServletContext();

}

Context 上下文

23_尚学堂马士兵_Struts2_模块包含

<struts>

<constant name="struts.devMode" value="true" />

<include file="login.xml" />

</struts>

可以将别的写好的配置文件直接包含到struts得配置文件中,方便多人开发避免不必要的配置文件冲突.

login.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>

<package name="login" extends="struts-default" namespace="/login">

<action name="login*" class="com.bjsxt.struts2.user.action.LoginAction{1}">

<result>/user_login_success.jsp</result>

</action>

</package>

</struts>

24_尚学堂马士兵_Struts2_默认Action

<package name="default" namespace="/" extends="struts-default">

<!-- 当配置文件中没有用户要访问的Aciton的时候,会调用<default-action-ref 所定义的Action --处理错误页面 -->

<default-action-ref name="index"></default-action-ref>

<action name="index">

<result>/default.jsp</result>

</action>

</package>

25_25_尚学堂马士兵_Struts2_Action总结

1 实现一个Action的最常用方式:从ActionSupport集成;

2  DMI动态方法调用!

3  通配符配置*  {1}{2}…

4接受参数的方法(一般属性或者DomainModel来接收。)

5 简单参数验证 addFieldError

a)       一般不适用struts2的UI标签

6 访问web元素

a)       MAP类型

1         IOC

2         依赖Struts2

b)       原始类型

1 IOC

3         依赖Struts2

7 包含文件配置

8 默认action处理

26_尚学堂马士兵_Struts2_常见问题.avi

Tomcat不要带空格路径

27_尚学堂马士兵_Struts2_结果类型_result_type_1

ResultType的最常用的几种配置:(四种配置分别代表了四种不同的跳转方式)

<package name="resultTypes" namespace="/r" extends="struts-default">

<action name="r1">

<!--type不写默认的为dispatcher:用服务器跳转跳转到结果页面--只能跳转到页面,不能跳转到Action -->

<result type="dispatcher">/r1.jsp</result>

</action>

<action name="r2">

<!--客户端跳转的方式跳转到结果页面  只能跳转到页面,不能跳转到Action  -->

<result type="redirect">/r2.jsp</result>

</action>

<action name="r3">

<!--服务器跳转的方式跳转到Action -->

<result type="chain">r1</result>

</action>

<action name="r4">

<!--客户端跳转的方式跳转到Action -->

<result type="redirectAction">r2</result>

</action>

<!--当要跳转的Action在别的包下的时候 应该这样写-->

<action name="r5">

<result type="china">

<parma name="actionName">dashboard</param>

<parma name="namespace">/sesure</param>

</result>

</action>

28_尚学堂马士兵_Struts2_结果类型_result_type_2.avi

29_尚学堂马士兵_Struts2_result_type_常见问题.avi

加参数的方式,跳转到其它的包中去,Param。

30_尚学堂马士兵_Struts2_Global_Results_全局结果集

<package name="user" namespace="/user" extends="struts-default">

<!-- 配置全局的结果集:当返回的result没有配置的时候会执行全局结果集的配置-->

<global-results>

<result name="mainpage">/main.jsp</result>

</global-results>

<action name="index">

<result>/index.jsp</result>

</action>

</package>

<!--关键字extends的使用:我想在下面的这个配置包中使用上面那个包中的结果集,那么可以使用extends关键字继承上一个包

<package name="admin" namespace="/admin" extends="user">

<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">

<result>/admin.jsp</result>

</action>

</package>

尚学堂 马士兵 struts_2视频教程 笔记心得 1——30课详解相关推荐

  1. 尚学堂-马士兵-专题-正则表达式

    一.最简单的正则表达式 String类的一个方法matches. package com.string;public class RegexTest {public static void main( ...

  2. 马士兵oracle安装视频教程,马士兵oracle视频教程笔记

    第一课:客户端 1. Sql Plus(客户端),命令行直接输入:sqlplus,然后按提示输入用户名,密码. 2. 从开始程序运行:sqlplus,是图形版的sqlplus. 3. http://l ...

  3. 马士兵JVM课程笔记

    马士兵JVM课程笔记 GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? ...

  4. 马士兵Hibernate学习笔记

    马士兵hibernate学习笔记 课程内容 6课程内容 1 HelloWorld 6 2 Hibernate原理模拟-什么是O/R Mapping以及为什么要有O/R Mapping 6 3 常见的0 ...

  5. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  6. 2接口详解_TS入门笔记2——TS接口进阶详解

    TS入门笔记--TS接口进阶详解 一.为什么需要接口? let obj:object; // 定义了一个只能保存对象的变量 // obj = 1; // obj = "123"; ...

  7. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  8. ROS入门笔记(七):详解ROS文件系统

    ROS入门笔记(七):详解ROS文件系统 文章目录 01 Catkin编译系统 1.1 Catkin特点 1.2 Catkin工作原理 1.3 使用`catkin_make`进行编译 02 Catki ...

  9. 信号与系统考研复习例题详解_小语种日语日本文学复习考研资料加藤周一《日本文学史序说(上)》笔记和考研真题详解...

    加藤周一<日本文学史序说(上)>笔记和考研真题详解 目录 序章 日本文学的特征 0.1 复习笔记 第一章 <万叶集>的时代 1.1 复习笔记 1.2 考研真题与典型题详解 第二 ...

  10. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解

    i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解 1 前言 2 FlexCAN简介 2.1 MB(邮箱)系统 2.1.1 正常模式下 2.1.2 激活了CAN FD情况下 2. ...

最新文章

  1. 怎么将SAP数据传输到其他系统(Transferring Data from SAP to Other Systems)
  2. Android build.gradle 获取Git 仓库数据
  3. java list容器_Java 容器列表(三)- ArrayList
  4. 企业软件是最难编写的软件
  5. Atitit 木马病毒自动启动-------------win7计划任务的管理
  6. Python爬取2万条微博热搜,带你揭开热搜趋势!
  7. 怎么用pr(Premiere)给视频添加水印
  8. 华为机试6-质因数分解
  9. matlab 均生函数,Matlab 的fspecial函数用法
  10. 几何光学学习笔记(23)- 5.6 远心光路
  11. html css jsp 数据库,html、css、js、jsp的区别是什么?
  12. Ensemble Learning(集成学习--AdaBoost,GBDT,Xgboost等)
  13. 墙裂推荐ShapeView二
  14. 深入理解SD卡:协议
  15. 样本均值,顺序统计量,样本中位数, 样本方差,样本标准差,直方图,核密度估计曲线,经验分布函数图,箱形图;matlab实现
  16. Android NFC开发概述
  17. MMX, SSE, SSE2
  18. 稀土掘金 2022 开发者大会观后总结
  19. Java日志框架-SLF4J入门
  20. c语言中10C是多少,耐克童鞋10c是多大码、7c内长是多少

热门文章

  1. 移动端后台管理系统框架
  2. IDEA注释模板配置
  3. 科赫小雪花python实验报告_基于python绘制科赫雪花
  4. 概率图模型和马尔可夫模型
  5. matlab力学大作业答案,计算力学大作业报告.docx
  6. 推荐一款国产免费开源的ERP进销存系统 附带安装详细教程
  7. Ubuntu通用基础教程
  8. Apple Pay 接入
  9. 超像素池化弱监督语义分割
  10. 锐捷计算机教室排顺序,大学四年说话最多的一堂课是在锐捷智慧教室