一、 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项目的开发流程

  1. 创建web项目
  2. 导入struts2相关的Jar包

提示:可以解压apps目录下的struts-blank.war,从它的lib目录中拷贝相关的jar包

  1. 在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>

  1. 在src中添加struts.xml文件
  2. 创建Action类,并添加Action方法

l 方式一:实现接口Action

常量:INPUT(input)、SUCCESS(success)、ERROR(error)、LOGIN(login)、NONE(none)

l 方式二:继承类ActionSupport

l 方式三:POJO类

  1. 在struts.xml文件中配置action节点
  2. 编写JSP页面

四、 struts.xml配置详解

  1. struts2的常量,可以在struts.xml的constant中设置,也可以单独写到struts.properties中。
  2. result节点的type属性
  • dispatcher:转发(JSP),默认值
  • redirect:重定向(JSP或外部url)
  • redirectAction:重定向到其他的action
  • chain:转发到其他的action
  • stream:文件下载
  • json:ajax请求时,一般以json格式串返回
  1. 常见配置介绍

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>

五、 拦截器

  1. 定义拦截器

实现接口:Interceptor

继承类:AbstractInterceptor

  1. 配置拦截器

首先,在Interceptors节点下添加Interceptor节点;

其次,要么在action中通过interceptor-ref使用拦截器,要么配置default-interceptor-ref

  1. 注意

一旦使用了自定义的拦截器,那么struts2提供的默认的拦截器defaultStack将不再起作用。

怎么破?新添加一个拦截器栈,里面添加对自定义拦截器和defaultStack的引用,然后将这个拦截器栈设置为默认的拦截器。

  1. struts2提供的拦截器

params拦截器

validation拦截器

fileUpload拦截器

workflow拦截器

… …

六、 文件上传

  1. jsp页面的form标记,method属性值必须为post
  2. jsp页面的form标记,必须添加enctype=multipart/form-data属性
  3. jsp页面中使用type=file的文件域
  4. 添加apache文件上传的jar包:commons-fileupload、commons-io
  5. 在Action类中添加三个属性:

private  File  xxx;

private  String  xxxFileName;

private  String  xxxContentType;

  1. 在action方法中实现文件的保存

避免文件名重名时文件被覆盖:uuid作为文件名

数据库中存储的文件路径一定要是相对路径

如何获取项目中指定目录的绝对路径

String path = ServletActionContext.getServletContext().getRealPath(“files”);

  1. 限制文件大小和文件类型

通过设置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>

  1. 多文件上传

只需要将action中的那三个属性设置为数组即可

private  File[]  xxx;

private  String[]  xxxFileName;

private  String[]  xxxContentType;

七、 文件下载

  1. 在action中必须存在一个InputStream类型的属性,并且该属性具有get方法
  2. 在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

  1. 方式一(耦合)

HttpServletRequest request = ServletActionContext.getRequest();

HttpSession session = ServletActionContext.getRequest.getSession();

HttpServletResponse response = ServletActionContext.getResponse();

ServletContext application = ServletActionContext.getServletContext();

  1. 方式二(非耦合)

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();

  1. 方式三(非耦合)

让Action类实现接口:RequestAware、SessionAware、ApplicationAware

九、 OGNL

  1. ognl:对象图导航语言
  2. ognl和el相似,都是用来简化jsp中的java代码
  3. ongl可以从2个地方获取数据
  • ValueStack:值栈。一般值栈中只会存放当前Action类的对象。
  • ActionContext:application、session、request、pageContext、parameters、attr。

注意:值栈中的数据可以直接通过名字获取;但是ActionContext中的数据则需要添加前缀#

#application

#session

#request

#pageContext

#paramteters

#attr

其中attr表示依次从pageContext、request、session、application中获取数据。

十、 struts2的标签

  1. jstl- JSP标准标签库
  • 核心标签

forEach、choose、when、otherWise、if

  • 格式化标签

formatDate、formatNumber

  1. struts2提供的标签

form、iterator、if、else、select、checkbox、checkboxlist、radio、fielderror

十一、 数据校验

  1. 客户端验证

通过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验证。

  1. 服务器端验证

服务器端的验证不能省。

如果没有通过数据校验,那么默认返回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>

十二、 国际化

  1. 国际化

同一套应用程序,针对不同语系、不同地区的用户显示特定的语言文字。

zh-CN、zh-HK、zh-TW、en-US、

  1. 本地化

针对不同语系、不同地区添加不同的资源文件

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

  1. ajax的定义

异步的javascript和xml。

  1. ajax的作用

异步请求,局部刷新

  1. ajax基本概念

ajax不是一种单独的技术,它涉及javascript、css、XMLHttpRequest等。它的核心组件是XMLHttpRequest,但是不同的浏览器对XMLHttpRequest的支持不同,所以在创建它的对象时,要分别对浏览器做出判断。因此在实际开发过程中,我们很少编写原生的ajax代码,而是使用jquery等框架提供的ajax函数来快速实现ajax效果。

  1. XMLHttpRequest

l open(method, url, async)

method:get|post请求发送的类型

l onreadystatechange

请求状态改变事件,需要挂载function。

readyState==4    status==200   表示成功

l send(data)

向服务器正式发送请求

  1. 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知识点复习的更多相关文章

  1. Spring知识点复习

    Spring知识点复习 一.专业术语 侵入式设计 引入框架,对现有的类的结构有影响,即需要实现或继承某些特定类.如:Struts框架 非侵入式设计 引入框架,对现有的类结构没有影响.如:Hiberna ...

  2. Hybrid App 应用开发中 9 个必备知识点复习(WebView / 调试 等)

    前言 我们大前端团队内部 ?每周一练 的知识复习计划继续加油,本篇文章是 <Hybrid APP 混合应用专题> 主题的第二期和第三期的合集. 这一期共整理了 10 个问题,和相应的参考答 ...

  3. python类,魔术方法等学习&&部分ssti常见操作知识点复习加深

    python类学习&&部分ssti常见操作知识点复习加深 在做ssti的模块注入的时候经常觉得自己python基础的薄弱,来学习一下,其实还是要多练习多背. 在python中所有类默认 ...

  4. C语言知识点复习梳理

    C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习. 本文目录如下: 基础知识. 顺序程序设计. 数据类型. 标准输入输出. 进制转换. 选择结构. 循 ...

  5. Struts2知识点学习笔记

    写给自己的话 好记性不如烂笔头,不可能说看了一遍视频就可以完全掌握的.留下这篇笔记,便于今后的复习吧. 1. 访问ServletAPI 访问ServletAPI(response,request,)的 ...

  6. JSOI2020备考知识点复习

    我太菜了qaq,我好爱咕咕咕啊 在NOIP2018爆炸后,我只能指望着在JSOI2019JSOI2020上咸鱼翻身(flag*1) 所以,我要开始复习学习(flag*2) 此博客文会不定时更新qaq( ...

  7. Struts2框架复习(一)--最基本的struts2框架

    前言 最近离职在家,发现之前学习的Struts2框架由于长时间不使用有点生疏,有鉴于此写下此文以备自己复习使用,同时也供大家批评指正. 准备工作 我觉得Struts2主要就是对Servlet的封装,还 ...

  8. NOIp知识点复习——最短路计数

    $Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...

  9. 【Hybird】274-Hybird App 应用开发中 5 个必备知识点复习

    前言 我们大前端团队内部 ?每周一练 的知识复习计划还在继续,本周主题是 <Hybird APP 混合应用专题> ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多. 之前分享的每周 ...

随机推荐

  1. c#使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    DotnetZip是一个开源类库,支持.NET的任何语言,可很方便的创建,读取,和更新zip文件.而且还可以使用在.NETCompact Framework中.  下载地址在这里:http://dot ...

  2. DNS没有生效的几个原因

    1.记录没有正确添加 请确认你的域名记录是否完全正确的添加.线路类型正确,记录类型正确 2.域名还没有生效 这个情况还会有另外一个现象,就是域名有时候可以ping,有时候不能ping. 这是因为你当地 ...

  3. 关于Visual Studio未能加载各种Package包的解决

    参考微软社区的一个答复解决了VS2013的问题: 进入VS对应的用户缓存文件夹,删掉那个Microsoft.VisualStudio.Default.cache缓存文件,就可以了. 这个错误估计是我们 ...

  4. 利用apache的mod_rewrite做URL规则重写

    使用mod_rewrite做url重写,伪静态,做过很多次,这次用几个例子记下来,便于后面查用. 使用方法: 1.在conf目录的httpd.conf文件中找到: LoadModule rewrite ...

  5. W3Cschool学习笔记——CSS教程

    CSS 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现 ...

  6. 5种IE hasLayoutt的属性及其值

    hasLayout 是Windows  Internet  Explore 渲染引擎的一个内部组成部分.在 Internet Explore 中,一个元素要么自己对自身内容进行计算大小和组织,要么依赖 ...

  7. (@WhiteTaken)设计模式学习——抽象工厂模式

    抽象工厂模式,可以向客户端提供一个接口,而客户端不用指定具体的类型创建对象,却能够创建多个产品族(一类具有共性产品,如地域等)的对象. 下面直接上代码. 1.苹果需要实现水果的接口,而苹果可以有北方的 ...

  8. Android搜索框以及内容提供器

    先看结果: 相关的官方文档在这里:Creating a Search Interface Android官方提供了两种方式: 弹出一个Dialog,覆盖当前的Activity界面 在AppBar中扩展 ...

  9. 用9种办法解决 JS 闭包经典面试题之 for 循环取 i

    2017-01-06 Tomson JavaScript 转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明 ...

  10. phpcms 列表项 内容项

    根据上一篇内容继续 首页替换完成后 接下来替换列表页 首先把列表的静态网页放入相应模板的content文件夹下,并改名为 list.html 并且创建栏目时选择下面一项 同样,头尾去掉,利用{temp ...