Struts2框架详细用法第一课

来源:互联网 发布:论持久战的影响知乎 编辑:程序博客网 时间:2024/05/29 13:05

1.     框架的意义

所谓框架就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多经历放到业务需求的分析和理解上面。特点:封装了很多细节,使程序员在使用的时候会非常简单。

2.     Struts2概述

Struts2是Apache发行的mvc开源框架,是表现层框架。是Apache和openSymphony组织合并开发出来的,里面包含了WebWork2的核心和struts的一些特性和功能,除此之外和struts1没有任何关系。

3.     Struts2搭建环境

①   下载Struts2开发包

下载地址:http://struts.apache.org

②   导入所需jar包到项目中

找到开发包自带的例子中,struts-blank的war包,在它的\WEB-INF\lib目录下的所有jar包就是使用struts2必须要的jar包,目录如下:


③   创建struts2的配置文件

在src路径下建立一个默认名称为struts.xml的配置文件,并导入约束。

<?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>

</struts>

④    配置控制器

配置位置:在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>

⑤   验证是否成功,启动tomcat,不报错表示搭建成功

4.      Struts2的入门案列

①   搭建环境

②   建立一个jsp文件

<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

     <title>struts2入门案例</title>

  </head>

  <body>

<%--web.xml配置的核心控制器的匹配的路径是/*,访问动作类的路径扩展名是默认的.action,也可以不加扩展名  --%>

    <a href="${pageContext.request.contextPath}/hello">访问helloAction</a><br>

    <a href="${pageContext.request.contextPath}/hello.action">同样访问helloAction</a>

  </body>

</html>

③   在struts.xml文件中配置

<?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>

     <packagename="p1"extends="struts-default">

         <actionname="hello"class="com.mangocity.web.action.HelloAction"method="hello">

              <resultname="success">/success.jsp</result>

         </action>

     </package>

</struts>

④   建立动作类和动作方法

public class HelloAction {

     public String hello(){

         System.out.println("hello,这是struts2的入门案例!");

         return "success";

     }

}

⑤   结果试图页面

<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>Struts2入门案例-执行结果试图</title>

  </head>

  <body>

    执行成功 <br>

  </body>

</html>

拓展:需求要配置shtml作为访问动作类的扩展名。

在struts.xml中配置访问动作类的扩展名:

<constant name="struts.action.extension" value="shtml" />

5.      Struts2的配置文件

①   加载时机:当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了

②   加载顺序,struts2jar包中及我们的项目中的配置文件有6个,其中加载顺序为:

顺序

配置文件名

所在位置

说明

1

default.properties

struts2-core-2.3.15.3.jar\org\apache\struts2

不能修改

2

struts-default.xml

struts2-core-2.3.15.3.jar

不能修改

3

strtuts-plugin.xml

在struts2提供的插件jar包中

不能修改

4

struts.xml

我们的应用中

我们修改的:推荐

5

struts.properties

我们的应用中

我们修改的

6

web.xml

我们的应用中

我们修改的,可以给过滤器配置参数

注意:struts2中提供了两种配置的方式:properties和xml.当多个配置文件中有相同的参数,后加载的值会把前面加载的值给覆盖掉。

6.      Struts2框架提供的常量

①   常用的常量

常量定义在了default.properties配置文件中,所有的strtuts2应用都会用到这些常量。

常用的常量:

常量名

常量值

说明

struts.i18n.encoding

UTF-8

应用中使用的编码

struts.objectFactory.spring.autoWire

name

和spring框架整合有关

struts.multipart.parser

jakarta

指定文件上传用的组件

struts.multipart.maxSize

2097152

文件上传总文件大小限制:2M

struts.action.extension

action,,

能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔

struts.enable.DynamicMethodInvocation

false

是否允许动态方法调用

struts.devMode

false

是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true

struts.ui.theme

xhtml

页面展示用的主题

②    在struts.xml中覆盖常量

使用<constant name=”” value=””></constant>元素进行覆盖,例:

把扩展名改成以.shtml结尾

<constant name="struts.action.extension" value="shtml" />

③    创建struts.properties文件覆盖

例:

#设置为开发模式

struts.devModel=true

#设置请求资源URI扩展名

struts.action.extension=shtml

④    在web.xml中配置过滤器参数

  <filter>

     <filter-name>struts2</filter-name>

     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

     <init-param>

         <param-name>struts.devModel</param-name>

         <param-value>true</param-value>

     </init-param>

  </filter>

7.       Xml配置文件的主要元素

7.1    package元素

7.1.1作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理,易于管理动作类,便于模块化开发动作类

7.1.2属性:

name:包的名称,必须写且唯一

extends:一般情况下需要继承struts-default包,但不是必须的,但如果不继承,将无法使用struts2提供的核心功能

abstract:把包声明为抽象包,抽象包是用来继承的,只要是没有<action>元素的包就可以声明为抽象包

namespace:名称空间。名称空间+动作名称 =访问路径

7.1.3动作类的搜索顺序:

Namespace的默认值:a.不写改属性 b.该属性=””  注意默认值不是”/”

7.2    action元素

7.2.1作用:配置动作类

7.2.2属性

name:动作类名称

class:动作类全路径,默认的动作类是:com.opensymphony.xwork2.ActionSupport,如果要替换默认的动作类,可以在package标签中加入:

<default-class-ref class="类全路径"/>

Method:动作类中的方法名称,默认是:public String execute(){}

7.3    result元素

7.3.1作用:为动作指定结果试图

7.3.2属性

Name:逻辑视图的名称,对应动作类的返回值,默认是SUCCESS

Type:结果类型,指的是用什么方式跳转到定义的页面。默认是dispatcher

         常用结果类型:

                dispatcher:请求转发

                redirect:重定向

                redirectAction:重定向到另一个动作类

a.       重定向到另一个相同名称空间的动作

<result name=”success” type=”redirectAction”>action2<result>

b.       重定向到不同名称空间的动作

<result name=”success” type=”redirectAction”>

       <param name=”namespace”>/n2</param>

       <param name=”actionName”>action2</param>

</result>

                                           chain:请求转发到另一个动作类

a.       请求转发到另一个相同名称空间的动作

<result name=”success” type=”chain”>action2<result>

b.       请求转发到不同名称空间的动作

<result name=”success” type=”chain”>

       <param name=”namespace”>/n2</param>

       <param name=”actionName”>action2</param>

</result>

7.3.3result元素中param子元素

在转发或者重定向到不同包下的动作时,都用到了param子元素

Param元素的作用:依赖注入(Dependence Injection)思想

 

8.       创建动作类的三种方式

方式一:创建一个普通的java类

方式二:动作类实现Action接口,Action接口中定义的一些常量:

常量变量名

对应的值

说明

SUCCESS

success

动作方法执行一切OK

ERROR

error

动作方法执行时遇到了异常

INPUT

input

回显

LOGIN

login

一般转向登陆页面

NONE

none

不转向任何的视图

 

方式三:动作类继承ActionSupport类

9.       动作类的访问

9.1    使用通配符

普通版:

<actionname="*"class="com.mangocity.web.action.UserAction"method="{1}">

     <resultname="success">/{1}.jsp</result>

</action>

升级版:

<actionname="*_*"class="com.mangocity.web.action.{1}Action"method="{2}">

     <resultname="success">/success.jsp</result>

</action>

 

9.2    动态方法调用

9.2.1在struts.xml中配置允许动态方法调用

<constant name="struts.enable.DynamicMethodInvocation"value="true"/>

<package name="hello" extends="struts-default" namespace="/hello">

     <actionname="hello"class="com.mangocity.web.action.HelloAction">

         <resultname="success">/success.jsp</result>

     </action>

</package>

9.2.2动态方法调用:动作名称!动作方法名称

10.    自定义结果类型

结果类型就是一个类,这些类都实现了com.opensymphony.xwork2.Result接口或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport,这些类都有一个doExecute方法,用于执行结果试图。

示例:创建验证码结果试图:

第一步:创建验证码结果类型类

public class CaptchaResultextends StrutsResultSupport {

     @Override

     protected void doExecute(String arg0, ActionInvocation arg1)

              throws Exception {

         ValidateCode code=new ValidateCode(200,100,4,10);

            HttpServletResponse response=ServletActionContext.getResponse();

            code.write(response.getOutputStream());

     }

}

第二步:在struts.xml中配置

<packagename="p1"extends="struts-default">

         <result-types>

            <result-typename="captcha"class="com.mangocity.web.result.CaptchaResult"></result-type>

         </result-types>

         <actionname="captchaAction">

              <resulttype="captcha"></result>

         </action>

11.    配置全局视图

结果视图的查找顺序:先找局部的结果视图,没有再找全局结果视图

<packagename="myDefault"extends="struts-default"abstract="true">

     <result-types>

         <result-typename="captcha"class="com.mangocity.web.result.CaptchaResult"></result-type>

     </result-types>

     <global-results>

         <resultname="success"type="captcha"></result>

     </global-results>

</package>

<package name="p1" extends="myDefault">

     <actionname="captchaAction"></action>

12.    在动作类中访问Servlet的API

第一种方式:使用ServletActionContext类

HttpServletRequest request=ServletActionContext.getRequest();

HttpServletResponse response=ServletActionContext.getResponse();

第二种方法:使用实现接口的方式,实现ServletRequestAware,ServletResponseAware

public class Demo2Action implements ServletRequestAware,ServletResponseAware {

 

     private HttpServletResponseresponse;

     private HttpServletRequestrequest;

     public void setServletResponse(HttpServletResponse response) {

         this.response=response;

     }

 

     public void setServletRequest(HttpServletRequest request) {

         this.request=request;      

     }

    

     public String add(){

         System.out.println(request);

         System.out.println(response);

         return "success";

     }

}

 

0 0
原创粉丝点击