Struts2

    xiaoxiao2021-03-25  94

    struts2知识点复习

    一、 MVC

    Ø Struts2简介Model 1:将所有的程序代码,都写到JSP页面中。

    Ø Model 2JSP(流程控制、数据显示) + JavaBean

    Ø 改进的Model2Servlet(流程控制) + Jsp(数据显示) + JavaBean(业务逻辑、数据处理)

    Ø MVC:将整个应用程序划分为3大组件(ModelViewController

    注意:MVC和三层不是一回事。

    二、 

    struts2是一个典型的MVC框架。

    struts2 = Struts1 + WebWork

    struts2下载包的目录结构:apps(示例程序)docs(帮助文档)、libjar包)、src(源码)

     

    三、 Struts2项目的开发流程

    1. 创建web项目

    2. 导入struts2相关的Jar

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

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

    4. src中添加struts.xml文件

    5. 创建Action类,并添加Action方法

    方式一:实现接口Action

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

    方式二:继承类ActionSupport

    方式三:POJO

    6. struts.xml文件中配置action节点

    7. 编写JSP页面

    四、 struts.xml配置详解

    1. struts2的常量,可以在struts.xmlconstant中设置,也可以单独写到struts.properties中。

    2. result节点的type属性

    Ø dispatcher:转发(JSP),默认值

    Ø redirect:重定向(JSP或外部url

    Ø redirectAction:重定向到其他的action

    Ø chain:转发到其他的action

    Ø stream:文件下载

    Ø jsonajax请求时,一般以json格式串返回

    3. 常见配置介绍

    l resultname属性可以省略,默认值为success

    l resulttype属性可以省略,默认值为dispatcher

    用户访问的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:每个packagename值都不能相同,必填

     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必填;classmethod可以省略;method如果省略默认为execute) -->

    <action name="login" class="" method="">

    <!-- name可以省略,默认值为successtype可以省略,默认值是dispatcher -->

    <result name="" type=""></result>

    </action>

    </package>

    <!-- 导入其他的struts配置文件,不管有多少个struts的配置文件,struts2框架而言,只会加载struts.xml,所有需要将其他的配置文件导入到struts.xml文件中 -->

    <include file=""></include>

    </struts>

    五、 拦截器

    1. 定义拦截器

    实现接口:Interceptor

    继承类:AbstractInterceptor

    2. 配置拦截器

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

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

    3. 注意

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

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

    4. 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-fileuploadcommons-io

    5. Action类中添加三个属性:

    private  File  xxx;

    private  String  xxxFileName;

    private  String  xxxContentType;

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

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

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

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

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

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

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

    8. 多文件上传

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

    private  File[]  xxx;

    private  String[]  xxxFileName;

    private  String[]  xxxContentType;

    七、 文件下载

    1. action中必须存在一个InputStream类型的属性,并且该属性具有get方法

    2. struts.xmlactionresult节点中,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();

    2. 方式二(非耦合)

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

    3. 方式三(非耦合)

    Action类实现接口:RequestAwareSessionAwareApplicationAware

    九、 OGNL

    1. ognl:对象图导航语言

    2. ognlel相似,都是用来简化jsp中的java代码

    3. ongl可以从2个地方获取数据

    Ø ValueStack:值栈。一般值栈中只会存放当前Action类的对象。

    Ø ActionContextapplicationsessionrequestpageContextparametersattr

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

    #application

    #session

    #request

    #pageContext

    #paramteters

    #attr

    其中attr表示依次从pageContextrequestsessionapplication中获取数据。

    十、 struts2的标签

    1. jstl- JSP标准标签库

    Ø 核心标签

    forEachchoosewhenotherWiseif

    Ø 格式化标签

    formatDateformatNumber

    2. struts2提供的标签

    formiteratorifelseselectcheckboxcheckboxlistradiofielderror

    十一、 数据校验

    1. 客户端验证

    通过javascript脚本验证用户数据是否合法

    <form>

      <input type=”submit” value=”save Data” οnclick=”return checkFormData();” />

    </form>

    <script type=”text/javascript”>

    function checkFormData(){

      … …

      return true|false;

    }

    </script>

    注意:客户端验证是不安全的。用户可以通过禁用js脚本让js代码失效;用户也可以使用HttpRequest来模拟用户请求来避免js验证。

    2. 服务器端验证

    服务器端的验证不能省。

    如果没有通过数据校验,那么默认返回input

    如果数据类型转换失败了,那么仍然会执行数据校验。

    如果没有通过数据校验,那么肯定不再执行目标action方法。

    Ø 重写父类ActionSupportvalidate方法

    Action类中所有的action方法都会被验证。

    Ø Action类中添加验证方法validateXxx方法

    该验证方法只对xxx方法起作用。

    Ø Action类同一个包中添加xml验证文件

    只对特定的action方法起作用。最大的好处就是不用再编写java验证代码。

    验证文件的格式:ActionClassName-actionAlias-validation.xml

    struts2内置的校验器:

    l required:必填校验器

    l requiredstring:必填字符串校验器(trim)

    l int:整数校验器

    l stringlength:字符串长度校验器(minLengthmaxLength)

    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-CNzh-HKzh-TWen-US

    2. 本地化

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

    3. 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的定义

    异步的javascriptxml

    2. ajax的作用

    异步请求,局部刷新

    3. ajax基本概念

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

    4. XMLHttpRequest

    l open(method, url, async)

    methodget|post请求发送的类型

    l onreadystatechange

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

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

    l send(data)

    向服务器正式发送请求

    5. jquery提供的ajax函数

    l load(url)

    加载指定url请求的结果

    l $.get(url, parameter, callback, type)

    get方式向服务器发送请求

    url:请求的地址

    parameter:请求的参数,一般是json格式的对象{id:5, name:”zhangsan”}

    callback:回调函数function(data){},其中data代表服务器返回的结果

    typetext|json|html|xml

    l $.post(url, parameter, callback, type)

    post方式向服务器发送请求。参数同$.get一样。

    l $.getJSON(url, parameter, callback)

    get方式向服务器发送请求。返回的结果为json格式。

    l $.ajax({})

    最底层的ajax函数。上面的所有函数都可以通过本函数实现。

    $.ajax({

    urlurl地址,

    type: “get|post”,

    data:{id:5, name:”zhangsan”},

    dataType: “json”,

    success:  function(data){},

    error: function(xhr){}

    });

    转载请注明原文地址: https://ju.6miu.com/read-26405.html

    最新回复(0)