struts2知识点复习
一、 MVC
- Model 1:将所有的程序代码,都写到JSP页面中。
- Model 2:JSP(流程控制、数据显示) + JavaBean
- 改进的Model2:Servlet(流程控制) + Jsp(数据显示) + JavaBean(业务逻辑、数据处理)
- MVC:将整个应用程序划分为3大组件(Model、View、Controller)
注意:MVC和三层不是一回事。
二、 Struts2简介
struts2是一个典型的MVC框架。
struts2 = Struts1 + WebWork
struts2下载包的目录结构:apps(示例程序)、docs(帮助文档)、lib(jar包)、src(源码)
三、 Struts2项目的开发流程
- 创建web项目
- 导入struts2相关的Jar包
提示:可以解压apps目录下的struts-blank.war,从它的lib目录中拷贝相关的jar包
- 在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> |
- 在src中添加struts.xml文件
- 创建Action类,并添加Action方法
l 方式一:实现接口Action
常量:INPUT(input)、SUCCESS(success)、ERROR(error)、LOGIN(login)、NONE(none)
l 方式二:继承类ActionSupport
l 方式三:POJO类
- 在struts.xml文件中配置action节点
- 编写JSP页面
四、 struts.xml配置详解
- struts2的常量,可以在struts.xml的constant中设置,也可以单独写到struts.properties中。
- result节点的type属性
- dispatcher:转发(JSP),默认值
- redirect:重定向(JSP或外部url)
- redirectAction:重定向到其他的action
- chain:转发到其他的action
- stream:文件下载
- json:ajax请求时,一般以json格式串返回
- 常见配置介绍
l result的name属性可以省略,默认值为success
l result的type属性可以省略,默认值为dispatcher
l 用户访问的url地址,为namespace+actionName
|
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 设置struts2的常量 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- 可以有多个package节点 --> <!-- name:每个package的name值都不能相同,必填 namespace:命名空间(URL地址的一部分) extends:一般都要继承struts-default包 --> <package name="default" namespace="/" extends="struts-default"> <!-- 结果类型 --> <result-types> <result-type name="" class=""></result-type> </result-types> <!-- interceptors用户声明所有的拦截器 --> <interceptors> <!-- interceptor声明拦截器 --> <interceptor name="" class=""></interceptor> <!-- 配置拦截器栈(多个拦截器可以构成拦截器栈) --> <interceptor-stack name=""> <!-- 引用的拦截器,可以是一个拦截器栈 --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 配置默认的拦截器 --> <default-interceptor-ref name=""></default-interceptor-ref> <!-- 默认的action。当用户在浏览器地址栏中没有输入任何action时,将访问本节点配置的action --> <!-- http://localhost:8080/projectname/ --> <default-action-ref name="login"></default-action-ref> <!-- 默认的action类(当action节点省略时,将使用本节点配置的类) --> <default-class-ref class=""></default-class-ref> <!-- 全局的result --> <global-results> <result name="login" type="dispatcher">/login.jsp</result> <result name="error" type="dispatcher">/error.jsp</result> </global-results> <!-- 全局的异常映射 --> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping> <exception-mapping result="error" exception="java.sql.SQLException"></exception-mapping> <exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping> </global-exception-mappings> <!-- action可以有多个(name必填;class和method可以省略;method如果省略默认为execute) --> <action name="login" class="" method=""> <!-- name可以省略,默认值为success;type可以省略,默认值是dispatcher --> <result name="" type=""></result> </action> </package> <!-- 导入其他的struts配置文件,不管有多少个struts的配置文件,struts2框架而言,只会加载struts.xml,所有需要将其他的配置文件导入到struts.xml文件中 --> <include file=""></include> </struts> |
五、 拦截器
- 定义拦截器
实现接口:Interceptor
继承类:AbstractInterceptor
- 配置拦截器
首先,在Interceptors节点下添加Interceptor节点;
其次,要么在action中通过interceptor-ref使用拦截器,要么配置default-interceptor-ref
- 注意
一旦使用了自定义的拦截器,那么struts2提供的默认的拦截器defaultStack将不再起作用。
怎么破?新添加一个拦截器栈,里面添加对自定义拦截器和defaultStack的引用,然后将这个拦截器栈设置为默认的拦截器。
- struts2提供的拦截器
params拦截器
validation拦截器
fileUpload拦截器
workflow拦截器
… …
六、 文件上传
- jsp页面的form标记,method属性值必须为post
- jsp页面的form标记,必须添加enctype=multipart/form-data属性
- jsp页面中使用type=file的文件域
- 添加apache文件上传的jar包:commons-fileupload、commons-io
- 在Action类中添加三个属性:
|
private File xxx; private String xxxFileName; private String xxxContentType; |
- 在action方法中实现文件的保存
避免文件名重名时文件被覆盖:uuid作为文件名
数据库中存储的文件路径一定要是相对路径
如何获取项目中指定目录的绝对路径
|
String path = ServletActionContext.getServletContext().getRealPath(“files”); |
- 限制文件大小和文件类型
通过设置fileUpload拦截器的参数即可实现。
maximumSize:限制文件上传的大小
allowedTypes:限制文件上传的类型
<constant name="struts.multipart.maxSize" value="1024000"></constant>
|
<interceptor-ref name="fileUpload"> <!--配置允许上传的文件类型--> <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param> <!--配置允许上传的文件大小单位字节--> <param name="maximumSize">5242880</param> </interceptor-ref> |
- 多文件上传
只需要将action中的那三个属性设置为数组即可
|
private File[] xxx; private String[] xxxFileName; private String[] xxxContentType; |
七、 文件下载
- 在action中必须存在一个InputStream类型的属性,并且该属性具有get方法
- 在struts.xml的action的result节点中,type属性值为stream
|
<result name=”xxx” type=”stream”> <param name=”contentType”></param> <param name=”inputName”>类型为inputstream的属性名</param> <param name=”contentDisposition”> attachment;filename=”${fileName}” </param> </stream> |
八、 struts2中如何使用servlet api
- 方式一(耦合)
|
HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = ServletActionContext.getRequest.getSession(); HttpServletResponse response = ServletActionContext.getResponse(); ServletContext application = ServletActionContext.getServletContext(); |
- 方式二(非耦合)
|
Map<String, Object> request = (Map<String, Object>) ActionContext.getContext().get(“request”); Map<String, Object> session = ActionContext.getContext().getSession(); Map<String, Object> application = ActionContext.getContext().getApplication(); |
- 方式三(非耦合)
让Action类实现接口:RequestAware、SessionAware、ApplicationAware
九、 OGNL
- ognl:对象图导航语言
- ognl和el相似,都是用来简化jsp中的java代码
- ongl可以从2个地方获取数据
- ValueStack:值栈。一般值栈中只会存放当前Action类的对象。
- ActionContext:application、session、request、pageContext、parameters、attr。
注意:值栈中的数据可以直接通过名字获取;但是ActionContext中的数据则需要添加前缀#
#application
#session
#request
#pageContext
#paramteters
#attr
其中attr表示依次从pageContext、request、session、application中获取数据。
十、 struts2的标签
- jstl- JSP标准标签库
- 核心标签
forEach、choose、when、otherWise、if
- 格式化标签
formatDate、formatNumber
- struts2提供的标签
form、iterator、if、else、select、checkbox、checkboxlist、radio、fielderror
十一、 数据校验
- 客户端验证
通过javascript脚本验证用户数据是否合法
|
<form> <input type=”submit” value=”save Data” onclick=”return checkFormData();” /> </form> <script type=”text/javascript”> function checkFormData(){ … … return true|false; } </script> |
注意:客户端验证是不安全的。用户可以通过禁用js脚本让js代码失效;用户也可以使用HttpRequest来模拟用户请求来避免js验证。
- 服务器端验证
服务器端的验证不能省。
如果没有通过数据校验,那么默认返回input。
如果数据类型转换失败了,那么仍然会执行数据校验。
如果没有通过数据校验,那么肯定不再执行目标action方法。
- 重写父类ActionSupport的validate方法
该Action类中所有的action方法都会被验证。
- 在Action类中添加验证方法validateXxx方法
该验证方法只对xxx方法起作用。
- 在Action类同一个包中添加xml验证文件
只对特定的action方法起作用。最大的好处就是不用再编写java验证代码。
验证文件的格式:ActionClassName-actionAlias-validation.xml。
struts2内置的校验器:
l required:必填校验器
l requiredstring:必填字符串校验器(trim)
l int:整数校验器
l stringlength:字符串长度校验器(minLength、maxLength)
l regex:正则表达式校验器
l date:日期校验器
l double:双精度校验器
|
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/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-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">10</param> <message>用户长度必须介于${minLength}-${maxLength}之间</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密码不能为空</message> </field-validator> </field> <field name="user.phone"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>手机号不能为空</message> </field-validator> <field-validator type="regex"> <param name="regex">^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$</param> <message>手机号码格式错误</message> </field-validator> </field> </validators> |
十二、 国际化
- 国际化
同一套应用程序,针对不同语系、不同地区的用户显示特定的语言文字。
zh-CN、zh-HK、zh-TW、en-US、
- 本地化
针对不同语系、不同地区添加不同的资源文件
- struts2中如何实现国际化
首先,在struts.xml文件中配置常量
|
<constant name="struts.custom.i18n.resources" value="message"></constant> |
其次,添加名称为message的资源文件
message_zh_CN.properties
message_en.properties
message.properties
最后,在JSP页面中使用s:text来显示文字,在数据验证文件中使用<message key=”key”>
十三、 ajax
- ajax的定义
异步的javascript和xml。
- ajax的作用
异步请求,局部刷新
- ajax基本概念
ajax不是一种单独的技术,它涉及javascript、css、XMLHttpRequest等。它的核心组件是XMLHttpRequest,但是不同的浏览器对XMLHttpRequest的支持不同,所以在创建它的对象时,要分别对浏览器做出判断。因此在实际开发过程中,我们很少编写原生的ajax代码,而是使用jquery等框架提供的ajax函数来快速实现ajax效果。
- XMLHttpRequest
l open(method, url, async)
method:get|post请求发送的类型
l onreadystatechange
请求状态改变事件,需要挂载function。
readyState==4 status==200 表示成功
l send(data)
向服务器正式发送请求
- jquery提供的ajax函数
l load(url)
加载指定url请求的结果
l $.get(url, parameter, callback, type)
以get方式向服务器发送请求
url:请求的地址
parameter:请求的参数,一般是json格式的对象{id:5, name:”zhangsan”}
callback:回调函数function(data){},其中data代表服务器返回的结果
type:text|json|html|xml
l $.post(url, parameter, callback, type)
以post方式向服务器发送请求。参数同$.get一样。
l $.getJSON(url, parameter, callback)
以get方式向服务器发送请求。返回的结果为json格式。
l $.ajax({})
最底层的ajax函数。上面的所有函数都可以通过本函数实现。
$.ajax({
url:url地址,
type: “get|post”,
data:{id:5, name:”zhangsan”},
dataType: “json”,
success: function(data){},
error: function(xhr){}
});
struts2知识点复习的更多相关文章
- Spring知识点复习
Spring知识点复习 一.专业术语 侵入式设计 引入框架,对现有的类的结构有影响,即需要实现或继承某些特定类.如:Struts框架 非侵入式设计 引入框架,对现有的类结构没有影响.如:Hiberna ...
- Hybrid App 应用开发中 9 个必备知识点复习(WebView / 调试 等)
前言 我们大前端团队内部 ?每周一练 的知识复习计划继续加油,本篇文章是 <Hybrid APP 混合应用专题> 主题的第二期和第三期的合集. 这一期共整理了 10 个问题,和相应的参考答 ...
- python类,魔术方法等学习&&部分ssti常见操作知识点复习加深
python类学习&&部分ssti常见操作知识点复习加深 在做ssti的模块注入的时候经常觉得自己python基础的薄弱,来学习一下,其实还是要多练习多背. 在python中所有类默认 ...
- C语言知识点复习梳理
C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习. 本文目录如下: 基础知识. 顺序程序设计. 数据类型. 标准输入输出. 进制转换. 选择结构. 循 ...
- Struts2知识点学习笔记
写给自己的话 好记性不如烂笔头,不可能说看了一遍视频就可以完全掌握的.留下这篇笔记,便于今后的复习吧. 1. 访问ServletAPI 访问ServletAPI(response,request,)的 ...
- JSOI2020备考知识点复习
我太菜了qaq,我好爱咕咕咕啊 在NOIP2018爆炸后,我只能指望着在JSOI2019JSOI2020上咸鱼翻身(flag*1) 所以,我要开始复习学习(flag*2) 此博客文会不定时更新qaq( ...
- Struts2框架复习(一)--最基本的struts2框架
前言 最近离职在家,发现之前学习的Struts2框架由于长时间不使用有点生疏,有鉴于此写下此文以备自己复习使用,同时也供大家批评指正. 准备工作 我觉得Struts2主要就是对Servlet的封装,还 ...
- NOIp知识点复习——最短路计数
$Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...
- 【Hybird】274-Hybird App 应用开发中 5 个必备知识点复习
前言 我们大前端团队内部 ?每周一练 的知识复习计划还在继续,本周主题是 <Hybird APP 混合应用专题> ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多. 之前分享的每周 ...
随机推荐
- Linux笔记(五) - 用户管理命令
(1)添加用户:useradd [选项] 用户 -u UID:手工指定用户的UID号-d 家目录:手工指定用户的家目录-c 用户说明:手工指定用户说明,有空格需加双引号-g 初始组:手工指定初始组-G ...
- SQL Server 手把手教你使用profile进行性能监控
200 ? "200px" : this.width)!important;} --> 介绍 经常会有人问profile工具该怎么使用?有没有方法获取性能差的sql的问题.自 ...
- iOS视频压缩处理
最近忙于项目开发, 昨天才完成整个项目的开发, 今天就抽出时间, 分享一下我在开发中所涉及到的技术问题! 由于近期开发涉及到视频, 所以视频压缩, 上传, 播放等一系列功能都是要涉及到的, 所以在此, ...
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...
- 关于C++的const对象
对于const类对象,类指针, 类引用, 只能调用类的const成员函数. 1.const成员函数不允许被修改它所在对象的任何一个成员变量. 2.const成员函数能访问对象的const成员, 而其他 ...
- web移动端Fixed在Input获取焦点时ios下产生的BUG及处理
1.现象 可以看到下面两张图,图1搜索框为fixed固定在顶部,滚动没有任何问题. 图2当光标进入搜索框时,ios自作聪明的把光标定位到中间,并且fixed属性被自动修改成了absolute.此时注意 ...
- 随机生成并排序 C,去同,有序数组合并排序
#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int ma ...
- margin-top、margin-bottom的一些分析
margin-top:表示该容器距离上面容器的距离 情况一:如果该容器上面没有容器,则这个样式属性则被父容器占用了 html代码如下: <div id ="fa"> & ...
- MobileOA第一期总结
MobileOA第一期总结 前段时间一直没有更新博客,好想给自己找个借口---恩,我还是多找几个吧.毕业论文.毕业照,再感伤一下,出去玩一下,不知不觉就过去几个月了.然后上个月底才重新回到学习之路,从 ...
- Struts2初步接触
使用idea快速搭建Struts2的Maven项目 首先使用intelij idea部署Maven项目 1.jar包引入 pom.xml 我们用的是阿里云 我用的是最新版的Struts2核心 ...