• Struts2基础


    <<struts-2.3.16.3-all.zip>>

    <<Struts2核心jar包.rar>>

    Struts2 简介

    Struts2 HelloWorld

    配置项目

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

       

    配置Struts2的核心控制器

    Struts配置文件(struts.xml)

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

    </struts>

    Struts2 原理介绍

    根据web.xml配置筛选请求,获取后与Struts.xml中的信息匹配到对应的action,处理对应操作

    Struts2 核心知识

    Struts2 get/set 自动获取/设置数据

    struts2会自动获取请求的数据并设置到对应变量中

       

    ActionSupport 类引入(一般全部Servlet继承ActionSupport

    Action类更强大

    Action 设置数据

    第一种方式:属性驱动(FieldDriven)

    基本数据类型属性

    login.xml提交数据

    提交数据处理

    web.xml指定对应的action操作

    将参数封装成javaBean对象后由对应Service处理

    处理好返回处理结果,根据结果跳转jsp页面,

    跳转jsp页面在struts.xml匹配返回的参数分配对应jsp页面,默认跳转到index.jsp

       

       

    struts.xml配置

    JavaBean类型属性 (一般全部使用这种

    login.xml提交数据

    提交数据处理

    struts.xml配置

    第二种方式:模型驱动(ModelDriven)(只能接收一种类型数据)

    login.xml提交数据

    提交数据处理

    struts.xml配置

    Struts2 处理传入多个值

    批量获取多个值(使用数组)

    处理数目不定的字符串;

    jsp请求

    action处理(Struts会自动塞到数组中去)

    处理数目不定的 JavaBean 对象

    jsp请求(必须按照javaBean对象的格式填写)

    action处理(Struts会自动塞到JavaBean类型的List集合中去)

    struts.xml 配置(修改后服务器需要重启)

    package 配置

    package用于区分action的(分类管理,划分模块的,没有实际作用)

    extends用于继承包(继承某些拦截器或其他用)

    namespace设置后访问包内部的action必须加namespace设置的url前缀(有前缀区分后里面的action名字可以一样,默认认为是目录作用的)(${pageContext.request.contextPath}/success.jsp这样访问的是绝对路径忽略namespace设置)(用于分类的)

    abstract 抽象包(不可以写具体的实现)(设置好后让其他用于实现的包继承)

    Action 配置

    name action名字(按照action名字调用action

    class 具体的请求处理类

    method 方法 (action默认执行的就是method设置的方法)(指定设置的方法)

    acation中设置方法

    分模块配置方法

    Struts.xml配置

    cheliang.xml配置

    url请求

       

    使用通配符(*号)

    将action的name名,后缀加*后

    jsp请求(都可以请求到action)

    多个通配符使用

    动态方法调用(默认是false不使用)

    开启动态方法调用:<constant name="struts.enable.DynamicMethodInvocation" value="true" />

    jsp请求(action名!有使用的action的方法)(自动对应执行action的方法)

    Action 生命周期

    每次请求都创建一个action实例(不是单例模式)(数据安全但资源占用高)

    result 配置

    type 默认是 dispatcher 内部转发

    type redirect 重定向(重定向到一个页面,数据不能共享)

    type chain 链条(返回到一个新的页面继续处理,数据共享不同处理)

    type redirectAction 重定向到 action(重定向到一个新的action,数据无法共享)

    上面 4 个常用,一定要掌握

    其他

    其他 freemarker freemarker 模版

    httpheader 返回一个已配置好的 HTTP 头信息响应

    stream 将原始数据作为流传递回浏览器端,

    velocity 呈现 Velocity 模板

    xslt XML 可以通过 XSL 模板进行转换

    plaintext 返回普通文本类容

    result 全局配置

    Struts2 拦截器

    拦截器简介(在执行action之前或之后做一些拦截操作)

    Struts2 预定义拦截器&拦截器栈

    自定义拦截器简单实例一

    Strusts.xml配置

    拦截器处理

    action做对应处理

    处理后返回数值struts对应到jsp页面响应

    自定义拦截器-登录验证拦截器(使用拦截器栈可以避免重复定义拦截器)

    值栈与 OGNL

    值栈简介(每次请求actoion会自动封装使用的数据到一块内存中)

    OGNL 引入

    action设置值栈数据

    jsp页面获取值栈数据

    导入标签

    获取值

    OGNL 访问复杂对象(都存在值栈中访问值栈获取)

    访问Javabean对象

    创建javabean

    action中设置javabean对象

    jsp页面设置ognl可访问的javabean数据

    访问list集合对象

    action中设置list对象集合

    jsp页面设置ognl可访问的数据

    访问map对象

    action中设置map对象

    jsp页面设置ognl可访问的数据

    OGNL 访问静态方法和属性

    在类中设置静态属性和静态方法

    jsp页面设置ognl可访问的静态属性和静态方法的数据

    默认不允许访问静态方法的,需要在struts.xml中设置

    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

    Struts2 标签

    Struts2 标签简介

    Struts2 数据标签(核心标签)

    Property 标签:输出 OGNL 表达式的值

    //设置值
    <%
            request.setAttribute("name","<font color=red>
    张三</font>");

    %>
    //取值

    <s:property value="#request.name" /><br/>

    //没有name2的值,default设置值

    <s:property value="#request.name2" default="某某人"/><br/>

    //escapeHtml设置false,开启使用html显示信息

    <s:property value="#request.name" default="某某人" escapeHtml="false"/><br/>

    Set 标签:设置变量

    //设置值,scope设置范围
    <s:set var="i" value="1"></s:set>
    <s:set var="a" value="'action
    范围的值'" scope="action"></s:set>
    <s:set var="p" value="'page
    范围的值'" scope="page"></s:set>
    <s:set var="r" value="'request
    范围的值'" scope="request"></s:set>
    <s:set var="s" value="'session
    范围的值'" scope="session"></s:set>
    <s:set var="app" value="'application
    范围的值'" scope="application"></s:set>

    //取值,#范围.属性名

    <s:property value="#i" /><br/>
    <s:property value="#a" /><br/>
    <s:property value="#attr.p"/><br/>
    <s:property value="#request.r"/><br/>
    <s:property value="#session.s"/><br/>
    <s:property value="#application.app"/><br/>

    Bean 标签:定义 javaBean 对象

    //设置值,定义javabean对象,设置Javabean属性

    <s:bean name="model.Student" var="student">
            <s:param name="name" value="'
    张三'"></s:param>
            <s:param name="age" value="10"></s:param>
    </s:bean>
    //取值,对象.属性

    <s:property value="#student.name"/>
    <s:property value="#student.age"/>

    Date 标签:日期标签

    //设置值
    <%
            request.setAttribute("date",new Date());
    %>
    //取值

    ${date }<br/>
    当前日期:<s:date name="#request.date" format="yyyy-MM-dd"/>

    Debug 标签:调试标签(可以看到一些各范围的数据信息)

    <s:debug></s:debug>

    Url&a 标签:超链接标签

    //设置超链接
    <s:url action="hello" namespace="/foreground" id="h">
            <s:param name="name" value="'struts2'"></s:param>
    </s:url>

    //使用超链接()

    <s:a href="%{h}">超链接</s:a>

    //第二种(一般使用第二种不用单独设置)

    <s:a action="hello" namespace="/foreground">
            <s:param name="name" value="'struts2'"></s:param>
            
    超链接2
    </s:a>

    Include 标签:动态包含标签

    //设置包含的对象
    <s:include value="head.html"></s:include>

    Struts2 控制标签

    Ifelse 标签:条件判断标签

    <s:if test="#request.age<20">

            年龄小于20
    </s:if>

    <s:elseif test="#request.age==20">
            
    年龄等于20

    </s:elseif>

    <s:else>

            年龄大于20
    </s:else>

    Iterator 标签:遍历标签

    <s:iterator value="#request.studentList" status="status">

            <tr>
                    <td><s:property value="#status.index+1"/></td>

                    <td><s:property value="id"/></td>
                    <td><s:property value="name"/></td>

                    <td><s:property value="age"/></td>

            </tr>
    </s:iterator>

    Append 标签:叠加标签

    //将两个list中的数据叠加添加到另一个list中(list1后接list2数据)
    <s:append var="studentList3">
            <s:param value="#request.studentList1"></s:param>
            <s:param value="#request.studentList2"></s:param>
    </s:append>

    Generator 标签:分隔标签

    //将var的值用,分割获取分割后的单个数据

    <s:generator separator="," val="'张三,李四,王五'" var="nameList"></s:generator>

    <s:iterator value="#nameList">
            <s:property/>
    </s:iterator>

    Merge 标签:组合标签

    //将两个list中的数据叠加添加到另一个list中(list1和list2数据混合到list3中)

    <s:merge var="studentList3">
            <s:param value="#request.studentList1"></s:param>
            <s:param value="#request.studentList2"></s:param>
    </s:merge>

    Sort 标签:排序标签

    //对list1进行排序,根据比较器排序

    <s:bean id="myComparator" name="comparator.MyComparator"></s:bean>

    <s:sort comparator="#myComparator" source="#request.studentList1" >

            <s:iterator status="status">
            <tr>
                    <td><s:property value="#status.index+1"/></td>
                    <td><s:property value="id"/></td>
                    <td><s:property value="name"/></td>
                    <td><s:property value="age"/></td>
            </tr>
            </s:iterator>
    </s:sort>

    //定义比较器

    Subset 标签:截取标签

    //索引数据,count要索引的数据个数,start从第几个开始索引(从零计数)
    <s:subset source="#request.studentList1" count="2" start="2">
            <s:iterator status="status">
            <tr>
                    <td><s:property value="#status.index+1"/></td>
                    <td><s:property value="id"/></td>
                    <td><s:property value="name"/></td>
                    <td><s:property value="age"/></td>
            </tr>
            </s:iterator>
    </s:subset>

    Strut2 界面标签

    Form 标签:表单提交标签

    //namespace可以区分地址名

    <s:form action="hello" method="post" namespace="/foreground">
    </s:form>

    Text 标签:文本标签

    用户名:<s:textfield name="userName"></s:textfield><br/>
    密码:<s:password name="password"></s:password><br/>
    备注:<s:textarea name="desc"></s:textarea><br/>

    Radios 标签:单选标签

    //list里是要设置的选项,value是默认选中那个

    性别:<s:radio list="#{0: ' ', 1:' '}" name="sex" value="0" /> area><br/>

    Checkboxlist 标签:复选框标签

    //同radio一样

    爱好:<s:checkboxlist list="#{0: '游泳', 1:'唱歌 ',2:'跳舞'}" name="hobby" value="1" />

    Select 标签:下拉框标签

    //同radio一样,multiple为false支持多选

    爱好:<s:select list="#{0: '游泳', 1:'唱歌 ',2:'跳舞'}" name="hobby" value="1" multiple="true"/>

    Strut2支持ui多个主题(都封装可以更好地换主题)

    Strut2其他标签

    Updownselect 标签(用于控制标签的选择)

    <s:updownselect
    list="#{0:'
    游泳', 1:'唱歌', 2:'跳舞'}"
    name="hobby"
    headerKey="-1"
    headerValue="
    请选择" //顶部标题
    emptyOption="true" //允许有空项
    allowMoveUp="true"
    //允许向上
    allowMoveDown="true"
    //允许向下
    allowSelectAll="true"
    //允许全选
    moveUpLabel="
    向上" //操作标签
    moveDownLabel="向下" //操作标签
    selectAllLabel="全选" /> //操作标签

    Optiontransferselect 标签 (根据显示的各部分自己修改)

    <s:optiontransferselect label="选择你喜欢图书" //标题

    //左边的

    name="cnbook" leftTitle="中文图书" list="{'struts2权威指南','轻量级javaeye 企业应用空实战','ajax讲义'}"

    //右边的

    doubleName="enBook" rightTitle="外文图书" doubleList="{'JavaScrip:The definitive Guide','export one-to-one'}" multiple="true"

    addToLeftLabel="向左移动" addToRightLabel="向右移动" addAllToRightLabel="全部右移" addAllToLeftLabel="全部左移"
    allowSelectAll="true" headerKey="cnKey" headerValue="
    选择图书" emptyOption="true" doubleHeaderKey="enKey"

    doubleHeaderValue="选择外文图书" doubleMultiple="true" doubleEmptyOption="true"

    leftDownLabel="向下移动" //操作标签
    rightDownLabel="向下移动" //操作标签
    leftUpLabel="向上移动" //操作标签
    rightUpLabel="向上移动" > //操作标签
    </s:optiontransferselect>

    Struts2 国际化

    国际化简介

    Struts2 国际化设置

    设置Strut.xml(java1234为配置文件的名字)

    <constant name="struts.custom.i18n.resources" value="java1234"></constant>

    设置配置文件

    配置java1234.properties文件(默认中文)

    //属性=要显示信息的Unicode编码

    userName=u7528u6237u540d //用户名的Unicode编码
    password=u5bc6u7801
    //密码的Unicode编码
    login=u767bu5f55

    welcomeInfo=u6b22u8fce{0}

    分别配置对应的显示信息(自动根据环境匹配的信息)

    英文使用({0}为要使用的参数)

    中文使用

    JSP页面(传递要使用的参数)

    选择Unicode编码

    Struts2 验证框架

    Struts2 验证简介

    Struts2 内置验证

    目录结构

    配置文件

       

    <validators>

    //普通字段验证

    <field name="user.userName">

    //字段验证器,必填项

    <field-validator type="requiredstring">

    //提示信息

    <message>请输入用户名</message>
    </field-validator>

    //对字段长度进行设置

    <field-validator type="stringlength">
            <param name="minLength">6</param>
    //最短长度
            <param name="maxLength">10</param>
    //最长长度
    <message>
    用户名必须在${minLength}${maxLength}之间</message> //提示信息
    </field-validator>
    </field>
    <field name="user.name">
            <field-validator type="requiredstring">
    <message>
    请输入姓名</message>
    </field-validator>
    </field>
    <field name="user.age">

    //int型默认自动设置为0

            <field-validator type="int">

    //字段必须大于

                    <param name="min">18</param>
    <message>
    年龄必须满18周岁</message>
    </field-validator>
    </field>
    <field name="user.email">
            <field-validator type="requiredstring">
    <message>
    请输入邮件</message>
    </field-validator>

    //必须是邮件类型的字段

    <field-validator type="email">
    <message>
    邮件格式不对</message>
    </field-validator>
    </field>
    <field name="user.homePage">
            <field-validator type="requiredstring">
    <message>
    请输入主页</message>
    </field-validator>

    //必须是网页类型的字段

    <field-validator type="url">
    <message>
    主页格式不对</message>
    </field-validator>
    </field>

    //验证表达式

    //表达式类型

    <validator type="expression">

    //字段与已存储字段的比较(表达式<![CDATA[表达式内容]]>

            <param name="expression"><![CDATA[!user.name.equals(user.userName)]]></param>
            <message>
    用户名和真实姓名不能相同</message>
    </validator>
    </validators>

      

    配置Strut.xml文件

       

    自定义验证(使用validators)

    自定义验证器类(继承FieldValidatorSupport

    将验证器添加到配置文件中

    <<validators.xml>>

    配置文件

    <validators>
    <field name="name">
    <field-validator type="requiredstring">
    <message>
    请输入姓名</message>
    </field-validator>
    //使用自定义验证器
    <field-validator type="sensitive">
    <message>
    有敏感词汇</message>
    </field-validator>
    </field>
    </validators>

    配置Strut.xml文件

    设置jsp页面请求

    Struts2 文件上传和下载

    Struts2 文件上传

    配置jsp页面(type为file)

    action处理(上传文件的名字和处理文件的名字保持一致)

    配置struts.xml(使用拦截器)

    配置文件的大小及类型

       

       

    大文件上传(默认2M

    <constant name="struts.multipart.maxSize" value="20000000"></constant>

    设置struts.multipart.maxSizevalue值

    多文件上传(改成数组)

    配置jsp页面(变成数组)

    action处理(文件对象,文件名,文件类型都变成数组)

    配置struts.xml

    Struts2 文件下载(返回的是文件流(默认ISO8859-1))

    action处理(将指定位置的文件对象转化为文件流)

    配置struts.xml

    配置jsp页面

    Struts2 防重复提交

    重复提交

    页面在刷新时用户再次提交,延迟时的提交处理

    使用<s:token/>标签防重复提交

    配置jsp页面(每次都会进行记录一次)

       

    配置struts.xml(通过返回值识别重复提交进行处理)

    使用 tokenSession 拦截器防重复提交(无视重复提交)

    配置struts.xml

       

    <interceptor-ref name="tokenSession"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

       

  • 相关阅读:
    如何获取Apollo上项目下的所有namespace?
    从源码研究如何不重启Springboot项目实现redis配置动态切换
    用 Explain 命令分析 MySQL 的 SQL 执行
    MySQL死锁系列-常见加锁场景分析
    带你100% 地了解 Redis 6.0 的客户端缓存
    Java 数据持久化系列之 HikariCP (一)
    MySQL的死锁系列- 锁的类型以及加锁原理
    Java 数据持久化系列之池化技术
    Redis Cluster 的数据分片机制
    Redis 命令执行过程(下)
  • 原文地址:https://www.cnblogs.com/ChengR/p/12486409.html
Copyright © 2020-2023  润新知