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=\u7528\u6237\u540d //用户名的Unicode编码
password=\u5bc6\u7801
//密码的Unicode编码
login=\u767b\u5f55

welcomeInfo=\u6b22\u8fce{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>

   

posted @ 2020-03-13 14:46  baicaiFX  阅读(168)  评论(0编辑  收藏  举报