写给自己的话

好记性不如烂笔头,不可能说看了一遍视频就可以完全掌握的。留下这篇笔记,便于今后的复习吧。

1、 访问ServletAPI

访问ServletAPI(response,request,)的三种方式:

  • ActionContext方式
  • 实现***Aware接口
  • ServletActionContext

2、Action的搜索顺序

http://localhost:8080/struts2/path1/path2/path3/student.action为例。

  • 第一步:先判断package是否存在,如:path1/path2/path3。如果存在,进入第二步,否则检查上一级路径下的package是否(直到默认的package),然后重复第一步。
  • 第二步:判断action是否存在,如果不存在,则去默认的namespace的package里面寻找。要是还没有,就报错!

心得:package里面的命名空间最好还是按照自己action对应的位置写,这样不仅高效管理,还利于代码的维护。

3、动态方法调用

释义:动态方法调用就是为了解决一个action对应多个请求的处理,以免action太多。

我的理解就是:让一个action类中execute方法,调用action中其他的定义的方法。这样就可以不用针对一个请求写一个对应的action了,减少了action类的个数,使得代码维护更容易!

动态方法调用的三种方式:

  • 指定method的属性:在struts.xml的action标签内进行method值得设置就可以了。(method的值就是我们要进行调用的方法的名称)这时一个action类可以被多个action映射,只要action的name不同就可以了。
  • 感叹号方式: 使用前提是在struts.xml内声明一个标签<constant name="struts.enable.DynamicMethodInvocation" value="truw"></constant>。然后在只需要在这一个action中的result标签内写上该方法的返回值即可(注意要一一对应才行。)

    //如下:在action类中定义了
    public String add() {
        return "add";
    }
    public String update() {
        return "update";
    }
    
    //则这时只需要在struts.xml中如下:
    <package name="default" namespace="/" extends="struts-default">
        <action name="default" class="action.HelloWorld">
            <result>/result.jsp</result>
            <result name="add">/add.jsp</result>
            <result name="update">/update.jsp</result>
        </action>
    </package>
    

    这样访问这个链接的时候如果仍然是http://localhost:8080/HelloWorld/HelloWorld.action的话,就会跳转到第一个result标签对应的result.jsp页面。

    如果想要访问add方法对应的那个页面,就需要如下http://localhost:8080/HelloWorld/HelloWorld!add.action就可以了。同样update方法的动态调用同样如此。

  • 通配符方式: 这个方式的使用方式如下

    <package name="default" namespace="/" extends="struts-default">
        <!--下划线的作用就是分隔而已,而*则是对应了method中的第一个{1},如果name="helloworld_*_*",则method="{1}{2}"-->
        <action name="helloworld_*" method="{1}"  class="action.HelloWorld">
            <result>/result.jsp</result>
            <result name="add">/{1}.jsp</result>
            <result name="update">/{1}.jsp</result>
        </action>
    </package>
    

    然后访问对应页面的时候只需要输入http://localhost:8080/HelloWorld/helloworld_add.action即可。

    下面是进阶版的通配符的使用:

    <package name="default" namespace="/" extends="struts-default">
        <!--我们应该尤其注意其{数字}对应的是哪一个通配符。下面的这种方式可以使用一个action完成所有的操作哦-->
        <action name="*_*" method="{2}"  class="action.{1}">
            <result>/result.jsp</result>
            <result name="add">/{2}.jsp</result>
            <result name="update">/{2}.jsp</result>
        </action>
    </package>
    

    使用的时候http://localhost:8080/HelloWorld/HelloWorld_add.action.其中的HelloWorld就是第一个通配符对应的action类中在action标签中的name值(注意其大小写,应符合在类中的名称)。add代表的就是第二个通配符了,对应result标签的name值即可。

总结:指定method仍然会有大量的action标签;感叹号方式官方不建议使用;通配符的方式最为实用

4、指定多个配置文件

为了解决一个struts.xml文件过大,我们可以使用include标签将完成了不同模块的moudle_struts.xml文件整合到总的struts.xml文件中。

    <struts>
        <include file="moudle1.xml"></include>
        <include file="moudle2.xml"></include>
        ···
    </struts>

5、默认Action

官方解释就是一个给定的类似于404错误的默认的显示页面

    <package name="default" namespace="/" extends="struts-default">
        <!--name就是对应的action的名称,如下-->
        <default-action-ref name="index"></default-action-ref>
        <action name="index">
            <result>/XX.jsp</result>
    </package>

6、Struts2后缀相关

更改后缀的好处是可以伪造“页面”。改成.do;.html;···

下面是更改后缀的几种方式:

  • struts.xml中的constant标签:<constant name="struts.action.extension" value="html"></constant>
  • struts.properties文件内:struts.action.extension = action,do,html···
  • 在web.xml中的filter标签内部进行配置。下面是一个小例子:

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.action.extension</param-name>
            <param-value>do,action,html···</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

总结:有后缀了url上就需要带上相应的后缀;后缀名为null的时候访问页面就可以不带后缀。

7、在action中如何接收参数

常用的接收参数的方式有:

  • 使用action的属性接收参数:比如一个表单,表单中的那些值要在相应的action类中声明为其属性,类似于bean的方式实现getter和setter的方法。这样在action标签中的method中对应的方法名就可以获取表单中提交的数据了。
  • 使用DomainModel接收参数:第一种方式面对一个表单可能会写上好多的属性,这样维护起来很麻烦,所以可以定义一个bean,然后再action类中使用这个bean作为其整体的属性即可。然后在表单中指定这个属性即可。如下:

        <!--注意这里面的user.username中的user就是在LoginAction类中的属性 -->
        <form action="LoginAction.action" method="login">
            UserName:<input type="text" name="user.username">
            Password:<input type="password" value="user.password">
            <input type="submit" value="Submit">
        </form>
        // 下面是LoginAction类的内容
        public class LoginAction extends ActionSupport {
            private User user;//尤其注意是user,小写。且对应于表单的那个user.无需实例化!!!
            public String login(User user){
                System.out.println(user.getUsername);
                return SUCCESS;
            }
            public User getUser() {
                return this.user;
            }
            public void setUser(User user) {
                this.user = user;
            }
    
        }
    
  • 使用ModelDriven接收参数:需要实现ModelDriven接口,里面的泛型就是我们的bean类型。然后去除User的getter和setter方法,再对User进行实例化,在getModel方法中进行返回即可。然后最重要的一点就是表单中就不需要再指定了,可以直接写username,或者password了。

7、处理结果请求

Struts2的处理流程如下:

用户请求 –> Struts框架 –> 控制器(Action)–> Struts框架 –> 视图资源(jsp)

下面看一个小例子<result name="success">/Success.jsp</result> result元素中的name就是result元素的逻辑的视图名称。

如果省略了name属性,系统将采用默认的name属性success。

系统共内置了五个特殊的字符串属性值,位于com.opensymphony.xwork.Action下,分别是:

  • SUCCESS:Action正确的执行完成,返回相应的视图,此为默认
  • NONE:表示Action的正确的执行完成,但是并不返回任何视图
  • ERROR:表示Action的执行失败,返回到错误处理视图
  • LOGIN:Action因为用户没有登录的原因而没有正确的执行,将返回该登陆视图,要求用户进行登录验证
  • INPUT:Action的执行,需要从前端界面获取参数,INPUT就是代表这个参数的输入页面,一般在应用中会对这些参数进行验证,如果炎症没有通过,将自动返回到这个视图。

了解了这些常量之后,下面就正式的进入处理结果的部分。

处理结果是在struts.xml中result标签进行配置的。分为局部结果(将result作为action的子标签进行配置)和全局结果(将result标签作为global-results【需要在一个package进行支撑】的子标签进行配置)

Struts2知识点学习笔记的更多相关文章

  1. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  2. 尚硅谷STRUTS2视频学习笔记

    上一个月一直在学习STRUTS2,学习的是尚硅谷佟刚老师的视频,因为很喜欢佟刚老师的声音,而且他讲的很细,笔记做的也多,基本上是照着他的视频完整的敲了一遍代码,下面就把学习到的知识梳理一遍,最后把项目 ...

  3. Struts2国际化学习笔记

    今天在家里学习了Struts2中的国际化技术,国际化技术其实我的理解就是同一个网站项目或者同一个网页能够自由切换或者自适应本地语言,并根据本地语言进行网页展示. 实现Struts2中的国际化的方法是: ...

  4. 【struts2】学习笔记

    常见问题及注意事项: 1.下载struts2时,要看清所下载的版本,不同版本web.xml配置路径不同! 2. 导入jar包时,导入的包要完全准确,缺少或过多的会导致缺失或冲突! 3. Registe ...

  5. j2ee开发之struts2框架学习笔记

    Struts2框架技术重点笔记 1.Struts2 是在webwork基础上发展而来. 2.Struts2 不依赖struts API和 servlet API 3.Struts2提供了拦截器,表现层 ...

  6. Spring+Struts2/Hibernate 学习笔记

    ============Spring与Struts2整合============ (1)拷JAR包(Spring.Struts2) (2)配置org.springframework.web.conte ...

  7. struts2视频学习笔记 29-30(Struts 2常用标签,防止表单重复提交)

    课时28 Struts 2常用标签解说 property标签 property标签用于输出指定值: <s:set name="name" value="'kk'&q ...

  8. struts2视频学习笔记 28(OGNL表达式)

    课时28 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语 ...

  9. struts2视频学习笔记 24-27(国际化)

    课时24 配置国际化全局资源文件.输出国际化信息 1.准备资源文件,添加到src目录下,资源文件的命名格式如下:baseName_language_country.propertiesbaseName ...

随机推荐

  1. 【Peaks加强版 BZOJ 3551】你被坑了吗?

    这道在没加读入优化时间在20s左右的题终于在大米饼两天的死缠烂打.鬼混.乱整乱撞后艰难地AC了.但惋惜的是,大米饼一号代码其实更加简洁,但至今找不出BUG,我将它放在下面,也许有一天从远方来的另一个大 ...

  2. bzoj1044[HAOI2008]木棍分割 单调队列优化dp

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4314  Solved: 1664[Submit][Stat ...

  3. 使设备I/O的核心模块工作,有哪两种方式?

    设备处理进程方式.文件操作方式.

  4. 深度学习 Fine-tune 技巧总结

    深度学习中需要大量的数据和计算资源(乞丐版都需要12G显存的GPU - -)且需花费大量时间来训练模型,但在实际中难以满足这些需求,而使用迁移学习则能有效 降低数据量.计算量和计算时间,并能定制在新场 ...

  5. vim的基本介绍

    vim四种模式: 1.正常模式(Normal-mode) 当我们打开vim时就会进入到正常模式,这个时候是不能编辑的,一般用于浏览文件,包括复制,删除一些文本操作.我们可以通过键盘的上下左右来进行光标 ...

  6. Spring中@Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  7. Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  8. gulp填坑记(二)——gulp多张图片自动合成雪碧图

    为优化图片,减少请求会把拿到切好的图标图片,通过ps(或者其他工具)把图片合并到一张图里面,再通过css定位把对于的样式写出来引用的html里面,对于一些图片较多的项目,这个过程可能要花费我们一天的时 ...

  9. JSON.parse()在火狐中的BUG

      //用sessionStorage解决load页面刷新问题 { //sessionStorage.removeItem("loadInfo"); var loadInfo=de ...

  10. 转载c++常忘的知识点

    C++的一些知识点比较零碎,下面清单的形式做一些记录与归纳,以供参考. 1.赋值操作符重载(深复制): (1)由于目标对象可能引用了以前的一些数据,所以应该先delete这些数据: (2)注意到对象可 ...