Struts2 属于业务逻辑层框架 底层封装的是Servlet
Servlet用于接收请求和处理响应的一套逻辑过程
只能用于web项目 web project
框架学习特点:
侧重整体流程步骤,再熟悉细节
框架只要会用就行,至于底层无须了解或适当了解就行
每个框架某个功能模块都需要一定的jar包支持 ,再使用中只需调用响应jar包中响应类的相应方法
Api文档来查找
框架各个类之间的设计方式 其实就是设计模式的内容
设计模式就相当与战略战术设计方式 三十六计
框架比如就是阵法
Struts2框架 和struts不同 ,很大的区别
Struts2实在struts和webwork在基础上发展起来的
下载struts2的驱动包 在官网
·https://struts.apache.org/
- struts-2.5.16-all.zip (65MB) [PGP] [MD5] 下载这个
下载好之后解压 lib目录底下所有的jar包 太多
Apps目录底下是所有的例子
取某个例子解压下 取里面的lib所有的驱动包 大概13个左右
搭建框架:
1. 创建web project ,导入jar包
直接复制粘贴到wen-inf下的lib目录里面
2. 在web.xml里面配置struts2的核心过滤器
<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过滤器,进入到struts2框架里面
3. 创建业务逻辑层的业务类
Struts2里面的基本单元就是Action,Action就是对servlet的封装
创建方式:
a. 实现Action接口
publicclass HelloAction implements Action{
@Override
public String execute() throws Exception {
return"success";
}
}
b. 继承ActionSupport类
publicclass HelloActionextends ActionSupport{
@Override
public String execute() throws Exception {
return"success";
}
}
实现接口和继承都能创建Action,但是ActionSupport里面可以实现校验的功能
因为ActionSupport同时实现了Action, Validateable
Action里面默认的执行方式是execute()方法
4. 配置Action 在struts.xml文件里面配置
注意: struts.xml一班写在src根目录底下 ,命名最好写成struts.xml
创建struts.xml时候必须引入dtd文件 ,否则不会自动提示
<struts>
<package name="default" namespace="/"extends="struts-default">
<action name="hello"class="com.mypack.struts.HelloAction">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
Package标签:表示action所属的包,可以有多个package,但是每个package name值时唯一的
Namespace代表浏览器访问该包底下的action路径问题
Namespace=”/” http://localhost:8080/项目名/hello
Namespace=”aaa” http://localhost:8080/项目名/aaa/hello
Extends 表示继承某个配置文件跟java继承概念差不多,一般值都写成 struts-default
Action配置:
Name表示的是该action的name值,表示访问该action时的信息,不能重复
Class表示对应的包名+类名 对应的action类
Method:方法名 表示执行某类底下的某个方法不配表示执行默认方法 execute()
Result:name值表示该action方法执行最终的返回值,如果是该返回值,进入到相应的页面或者逻辑
Type属性值:
dispatcher: 请求转发没有配置默认值为dispatcher,请求转发到另外页面
redirect: 重定向 重定向到另外的一个页面
redirectAction:重定向到另外一个Action
通过浏览器url来访问该action 通过该Action配置的name值来访问:
http://ip地址:端口号/项目名 /action标签的name属性值
常用配置:
Struts接口里面内置常量:
Action接口中定义了一些常量属性:
public static final String | ERROR | "error" |
public static final String | INPUT | "input" |
public static final String | LOGIN | "login" |
public static final String | NONE | "none" |
public static final String | SUCCESS | "success" |
当某个action返回值是上面常量值时,就可以互相替代
Return“success” 可以写成 return SUCCESS;
Return “input” 可以写成 return INPUT;
Struts.xml里面配置的常量信息
<constant name=" " value="">
在struts2中,配置文件需要配置不少常量,其中常用的如下:
<constant name="struts.i18n.encoding" value="UTF-8"/>
struts.i18n.encoding:这个常量会作用于setCharacterEncoding方法和freemarker,velocity(这两种为模板技术)的输出,POST方式提交的数据,可以交由这个常量去设置它的编码格式。
<constant name="struts.configuration.xml.reload" value="true"/>
struts.configuration.xml.reload:当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好打开,开发完后再关闭。
<constant name="struts.serve.static.browserCache" value="false"/>
truts.serve.static.browserCache:设置浏览器是否缓存,默认值为true,开发阶段最好关闭。
<constant name="struts.devMode" value="true"/>
struts.devMode:打印出更详细的错误信息,用于排错,主要用于开发模式,做好了再关闭,在copysturts-blank中的stuts.xml中,里面有这常量。
<constant name="struts.ui.theme" value="simple"/>
struts.ui.theme:标签所使用的额外的自定义样式,不太实用,最好设置成simple,且一般都不用到struts 2的标签库。
<constant name="struts.objectFactory" value="spring"/>
struts.objectFactory:与spring继承时,指定由spring负责action对象的创建,在继承spring时,会用到这个常量.
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
struts.enable.DynamicMethodInvocation:该属性设置struts2是否支持动态方法调用,该属性的默认值是true,如果需要关闭动态方法调用,则可设置该属性为false,
注意:DMI的调用方式Struts2的文档不建议使用,且下载的struts2-2-X.jar中,它的sturts-blank中sturts.xml有这常量,并设其值为false。
<constant name="struts.multipart.maxSize" value="20971520"/>
struts.multipart.maxSize:设置上传文件的总大小限制,老杨说过它上传无法传太大的,可能是这里没设置。
注意:用HTML方式来上传是无法上传太大的文件,很不稳定,可以说失败率超高。解决方法是用socket编个插件用于上传,而不能直接依赖。
<constant name="struts.action.extension" value="do,lz"/>
struts.action.extension:修改后缀名,默认是action,可以修改。若值有多个,可用逗号隔开,这对于常量的值都通用。
<constant name="struts.custom.i18n.resources" value="baseName"/>
struts.custom.i18n.resources:用于配置国际化全局XML资源文件,须在指明该全局资源文件的基础名。
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
struts.ognl.allowStaticMethodAccess:如其名,用于设置OGNL是否允许静态方法访问,默认为false。
方法调用:
publicclass HelloActionextends ActionSupport{
@Override
public String execute() throws Exception {
return"success";
}
public String login(){
returnSUCCESS;
}
}
Struts.xml
<struts>
<package name="default" namespace="/"extends="struts-default">
<action name="hello"class="com.mypack.struts.HelloAction">
<result name="success">index.jsp</result>
</action>
<action name="hello2"class="com.mypack.struts.HelloAction">
<result name="success">index.jsp</result>
</action>
<action name="hello3"class="com.mypack.struts.HelloAction" method="login">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
1. 没有配置method属性, 直接访问action,表示执行的是默认的方法execute()
http://localhost:8080/项目名/hello
执行的是execute()方法
2. 没有配置method属性,访问某个方法 action!方法名
http://localhost:8080/项目名/hello2!login
执行的是login方法
3. 配置method属性,访问action就是访问配置的method方法
http://localhost:8080/项目名/hello3
执行的是login方法
4. 通配符
publicclass HelloAction extends ActionSupport{
public String addStu(){
returnSUCCESS;
}
public String delStu(){
returnSUCCESS;
}
}
<struts>
<package name="default"namespace="/" extends="struts-default">
<!--
<action name="add"class="com.mypack.struts.HelloAction" method="addStu">
<result name="success">index.jsp</result>
</action>
<action name="del"class="com.mypack.struts.HelloAction" method="delStu">
<result name="success">index.jsp</result>
</action>
-->
<!--通配符 下面这种效果就等效于上面效果 -->
<action name="{1}" class="com.mypack.struts.HelloAction" method="{1}Stu">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
<struts>
<package name="default"namespace="/" extends="struts-default">
<!--
<action name="addStu" class="com.mypack.struts.StuAction" method="addStu">
<result name="success">index.jsp</result>
</action>
<action name="delStu"class="com.mypack.struts.StuAction" method="delStu">
<result name="success">index.jsp</result>
</action>
<action name="addTea"class="com.mypack.struts.TeaAction" method="addTea">
<result name="success">index.jsp</result>
</action>
<action name="delTea"class="com.mypack.struts.TeaAction" method="delTea">
<result name="success">index.jsp</result>
</action>
-->
<!--通配符下面这种效果就等效于上面效果-->
<action name="{1}{2}"class="com.mypack.strut.{2}Action" method="{1}{2}">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
Struts2校验:
1. Validate()方法
2. ValidateXXX()方法
publicclass HelloAction extends ActionSupport{
public String login(){
returnSUCCESS;
}
publicvoid validate(){
System.out.println("校验的逻辑");
}
publicvoid validateLogin() {
//手动后台校验 只校验login方法
}
}
<action name="login" class="com.mypack.struts.HelloAction"method="login">
<result name="success">index.jsp</result>
<!-- 校验的name值为input-->
<result name="input">login.jsp</result>
</action>
前台页面如果要看到错误信息:
页面引入Struts标签 login.jsp
<form action="login">
用户名:
<input type="text" id="username" name="user.username"/><s:fielderror fieldName="user.username"></s:fielderror><br>
密码:
<input type="password" id="password" name="user.password"/><s:fielderror fieldName="user.password"></s:fielderror><br>
<input type="submit" value="login" />
3. 校验框架
Struts2内置了校验框架,通过对应关系起作用
a. 校验规则配置文件与Action类必须在同一文件夹下
b.校验规则配置文件文件名必须是
Action类名-validation.xml
Action类名-别名-validation.xml
c. 别名对应的是Action配置中name属性的值 ,也就是只校验一个action中的某个方法。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">
true
</param>
<message>
用户名不能为空!
</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="stringlength">
<param name="minLength">
1
</param>
<param name="trim">
true
</param>
<message>
密码不能小于${minLength}位!
</message>
</field-validator>
</field>
<field name="user.address">
<field-validator type="regex">
<param name="expression"><![CDATA[([a-zA-Z_]+)]]></param>
<message>
地址只能是英文字符和下划线
</message>
</field-validator>
</field>
</validators>
验证规则:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
例子:
1。必填检验
<validators>
<field name="username">
<field-validator type="required">
<message>指定检验失败的提示信息
</message>
</field-validator>
</field>
</validators>
2。必填字符串检验
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true
</param>
<message>指定检验失败的提示信息
</message>
</field-validator>
</field>
</validators>
3。整数检验器/浮点检验
<validators>
<field name="age">
<field-validator type="int">
<param name="min">1
</param>
<param name="max">150
</param>
<message>年纪必须在1到150之间
</message>
</field-validator>
</field>
</validators>
4。日期检验
<validators>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01
</param>
<param name="max">2050-02-21
</param>
<message key="birth.range"/>
</field-validator>
</field>
</validators>
5.字段表达式检验器(要求指定字段满足一个逻辑表达式)
<validators>
<field name="re_pass">
<field-validator type="fieldexpression">
<!--指定逻辑表达式 -->
<param name="expression">(pass eq re_pass)
</param>
<message>密码必须和确认密码相等
</message>
</field-validator>
</field>
</validators>
6邮件地址校验
<validators>
<field name="email">
<field-validator type="email">
<message>你的电子邮件地址必须是一个有效的电邮地址
</message>
</field-validator>
</field>
</validators>
7。网址检验
<validators>
<field name="url">
<field-validator type="url">
<message>你的主页地址必须是一个有效的网址
</message>
</field-validator>
</field>
</validators>
8.字符串长度检验
<validators>
<field name="user">
<field-validator type="stringlength">
<param name="minlength">4
</param>
<param name="maxlength">20
</param>
<message>你的用户名长度必须在4到20之间
</message>
</field-validator>
</field>
</validators>
9.正则表达式检验
<validators>
<field name="user">
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的用户名只能是字母和数组,且长度必须在4到25之间
</message>
</field-validator>
</field>
</validators>
Struts标签:
1. jsp引入struts2标签库
<%@ tagliburi="/struts-tags" prefix="s" %>
2. 使用
3. 表单标签
4. 表单标签的通用属性
属性名 | 主题 | 数据类型 | 说明 |
title | simple | String | 设置表单元素的title属性 |
disabled | simple | String | 设置表单元素是否可用 |
label | xhtml | String | 设置表单元素的label属性 |
labelPosition | xhtml | String | 设置label元素的显示位置,可选值 : top 和 left(默认) |
name | simple | String | 设置表单元素的name属性,与Action中的属性名对应 |
value | simple | String | 设置表单元素的值 |
cssClass | simple | String | 设置表单元素的class |
cssStyle | simple | String | 设置表单元素的style属性 |
required | xhtml | Boolean | 设置表单元素为必填项 |
requiredpositon | xhtml | String | 设置必填标记(默认为*)相对于label元素的位置,可选值:left 和right(默认) |
tabindex | simple | String | 设置表单元素的tabindex属性 |
5.
6. <form>标签的常用属性及描述
属性名 | 是否必填 | 类型 | 说明 |
action | 否 | String | 指定提交时对应的action,不需要action后缀 |
enctype | 否 | String | HTML表单enctype属性 |
method | 否 | String | HTML表单method属性 |
namespace | 否 | String | 所提交action的命名空间 |
7.
8. <s:submit>标签的常用属性
属性名 | 是否必填 | 类型 | 说明 |
action | 否 | String | 指定提交时对应的action |
method | 否 | String | 指定action中调用的方法 |
9.
10.<s:password>标签的常用属性说明
属性名 | 说明 |
Name | 用于指定密码输入框的名称 |
Size | 用于指定密码输入框的显示宽度,以字符数为单位 |
MaxLength | 用于限定密码输入框的最大输入字符串个数 |
showPassword | 是否显示初始值,即使显示也仍为密文显示,用掩码代替 |
11.
12.<s:radio>标签的属性及说明
属性名 | 是否必填 | 类型 | 说明 |
List | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成单选框中的集合 |
listKey | 否 | String | 指定集合对象中的哪个属性作为选项的value |
listValue | 否 | String | 指定集合对象中的哪个属性作为选项的内容 |
13.
14.<s:checkboxlist>标签的常用属性及说明
属性名 | 是否必填 | 类型 | 说明 |
name | 否 | String | 指定该元素的name |
list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成多选框的集合 |
listKey | 否 | String | 生成checkbox的value属性 |
listValue | 否 | String | 生成checkbox后面显示的文字 |
15.
16.select标签的常用属性及说明
属性名 | 是否必填 | 类型 | 说明 |
list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成下拉框的集合 |
listKey | 否 | String | 生成选项的value属性 |
listValue | 否 | Strmg | 生成选项的显示文字 |
headerKey | 否 | String | 在所有的选项前再加额外的一个选项作为其标题的value值 |
headerValue | 否 | String | 显示在页面中header选项的内容 |
Multiple | 否 | Boolean | 指定是否多选,默认为 false |
emptyOption | 否 | Boolean | 是否在标题和真实的选项之间加一个空选项 |
size | 否 | Int | 下拉框的高度,即最多可以同时显示多少个选项 |
Ognl表达式取值:
通过<s:debug>标签来观察取值是否使用#
正常点开debug标签会有上下两部分 ,上面部分为 属性和对应的值;下面部分是键值对类型 ,map集合
如果取属性值 直接取 不用加# <s:property value=”属性”/>
如果取下面键值对值,需在前面加# <s:property value=”#键”/>
Struts2里面的传值取值:
前端页面和后台逻辑的数据会自动对接,无须自己手动处理
要求:
通过属性来对接的,所以属性必须有对应的getter,setter方法
1前端
name=”username” name=”password”;
后台Action
Stringusername;
Stringpassword;
必须对应起来,并且getter,setter方法
2前端
name=”user.username” name=”user.password”;
实体类
classUser{
Stringusername;
Stringpassword;
//getter.setter方法
}
Action:
属性: User user;
//getter,setter方法
3 前端
name=”username” name=”password”;
实体类
classUser{
Stringusername;
Stringpassword;
//getter.setter方法
}
ClassUserAction extends ActionSupport implements ModelDriven<User>{
//属性:
User user;
//getter,setter方法
publicUser getModel(){
returnuser;
}
}
拦截器:
自定义过滤器:
1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
public class CheckLoginInterceptorextends AbstractInterceptor {
public String intercept(ActionInvocation actionInvocation) throwsException {
if (满足条件) {
return actionInvocation.invoke();//放行
}
return login.jsp;//不满足,返回登录页面
}
}
2 在strutx.xml中注册上一步中定义的拦截器。
注册拦截器
<interceptors>
<interceptor name="loginInter"class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>
</interceptors>
3 哪个Action需要被拦截直接配置就行了
<action name="login"class="xx.xx.xx.UserAction" method=”login”>
<result name="success">index.jsp</result>
<interceptor-refname=" loginInter "/>
</action>
国际化:
参考百度,直接搜
上传和下载:
Ajax:
异步处理: jquery里面调用ajax 后台使用struts2来实现
其实跟servlet一样,只不过后台用action实现
Jquery easyUI:
封装好的前端框架
参考官网,官方文档
http://www.jeasyui.net/