Struts2 —— 基础与实践

xiaoxiao2021-02-28  122

一、基础使用

使用struts2.5.10

1、配置Struts2 与 简单使用

(1)、导包。通过实践,Struts 2.5.10必须导入的包如下:(其实在某个名为min-struts.xml 中所列的就是必须的jar包)

注:其中log4j-api-**.jar 不同于普通的log4j -**.jar,所以只能导入struts 中的该日志包,但common-logging-**.jar应该是相同的。

(2)、配置web.xml。两种方式使用struts。

<!-- 通过struts的StrutsServlet 类管理,不推荐,但适用于业务是特定的情况 --> <servlet> <servlet-name>strutsServlet</servlet-name> <servlet-class>org.apache.struts2.dispatcher.servlet.StrutsServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>strutsServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <!-- 通过struts的StrutsPrepareAndExecuteFilter 类管理,推荐方法--> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

(3)、在java源文件目录src 目录配置struts.xml (不能在其它目录或src 的子目录!)

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="myPackage" extends="struts-default" > <action name="first"> <result>/loginOn.jsp</result> </action> </package> </struts>注:action 的name属性值最后作为访问的url,访问基础格式:first.action。映射到loginOn.jsp

4、编写页面,通过struts2 实现简单跳转

index.jsp中:

<a href="first.action">first.action请求struts2</a>说明:访问struts2的name 为first 的action。也即访问到映射的loginOn.jsp页面。

2、新手常见问题

常遇到错误:There is no Action mapped for namespace / and action name

常见原因:

(1)、struts.xml文件名错误。一定要注意拼写问题(自己就一直认为是Structs ...);

(2)、struts.xml文件放置路径错误。一定要将此文件放置在src目录下。编译成功后,要确认是否编译到classes目录中;

(3)、struts.xml文件内容错误。尤其是 声明部分,正确配置参考:

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">说明:其中的版本号保留2位,所以不同版本的struts,在此基础上改版本号即可。

参考:

(1)、There is no Action for namespace / and..问题总结 (2)、DOCTYPE 声明标准

DOCTYPE 标准格式:

<!DOCTYPE rootElementName PUBLIC "PublicIdentifier" "URIreference">其中publicIdentifier 格式如下,URIreference 为标签定义文件位置。

DTD名称格式为"注册//组织//类型 标签//语言"

二、Struts 2 的Action 对象

struts1 中,所有控制器都继承 org.apache.struts.action.Action 类。

struts2 中,有所改变:存在于core jar文件的com.opensymphony.xwork2包中。下面的记录都是关于struts2 的。

1、Action 接口

该接口定义了5个常量与execute 方法。常量分别为:SUCCESS、NONE、INPUT、LOGIN、ERROE,常量表示请求结果,并作为返回哪个页面的一个判断条件。

execute 方法便是返回这几个值中的某个,表明当前action 请求状态。

各常量值含义:

SUCCESS: The action execution was successful. Show result view to the end user.成功并返回一个页面 NONE: The action execution was successful but do not show a view. This is useful for actions that are handling the view in another fashion like redirect.成功但不返回页面。 INPUT: This result is also used if the given input params are invalid, meaning the user should try providing input again.与输入有关的请求失败,如输入不合法、输入不全等。 LOGIN: The action could not execute, since the user most was not logged in. The login view should be shown.用户未登陆,无法执行action ERROR: The action execution was a failure.Show an error view, possibly asking the user to retry entering data.执行action 失败,展示失败页面

2、应用动态Action 

所谓动态action,就是一个Action 对象(表示某类业务)中有中几个方法,每次决定请求哪个具体方法。

(1)、简单实践:PlainAction.java

package com.milan.actions; import com.opensymphony.xwork2.ActionSupport; public class PlainAction extends ActionSupport{ private static final long serialVersionUID = 1L; public String actionA(){ return "actionA"; } public String actionB(){ return "actionB"; } }

(2)、struts.xml 中配置该Action对象:(部分代码)

<struts> <package name="myPackage" extends="struts-default" > <action name="first"> <result>/loginOn.jsp</result> </action> <action name="plainAction" class="com.milan.actions.PlainAction"> <result name="actionA" type="">/showA.jsp</result> <result name="actionB" type="">/showB.jsp</result> </action> </package> </struts>说明:两个关键属性,result 元素的name属性值取该action 的某个方法的返回值,通常设置与对应方法名相同。type 用于设置返回类型,如转发还是重定向,具体取值暂不讨论。

(3)、页面中请求

<a href="first.action">first.action请求struts2</a> <a href="plainAction!actionA">请求actionA并到达showA.jsp页面</a> <a href="plainAction!actionB">请求plainAction的actionB方法并到达showB.jsp页面</a>注:请求一个方法的action:actionName.action,动态请求action:actionName!方法名。

三、关于Struts 2 中的配置

使用Struts 2 时需配置相关文件,以使各程序模块之间可以通信。

1、Struts 2 的配置文件类型

(1)、struts-default.xml:位于core jar包中(该包中还存放了许多dtd文件);是struts2 提供的配置文件。

(2)、struts-plugin.xml:位于struts2 提供的各插件的包中。

(3)、struts.xml:Web 应用默认的struts 2 配置文件,需自己编写。

(4)、struts.properties:struts 2 中属性配置文件,需自己编写。

(5)、web.xml:即该应用的web.xml ,在里面配置Struts 2 的StrutsServlet 或 StrutsPrepareAndExecuteFilter 。

2、配置Struts 2 的package

实例:

<!-- struts元素下与package 元素同级的其它元素 <bean class=""></bean> <constant name="" value=""></constant> <include file=""></include> --> <!-- 属性说明: name:包名,不同于java的包名含义,此处只是用于区别包的 extends:继承于 namespace:指定命名空间,也对应路径,相当于java的包,对应文件夹。相对于根路径。 --> <package name="parentPackage" extends="struts-default" namespace="resource"> </package> <package name="myPackage" extends="parentPackage" namespace="/jsp"> <action name="first"> <result>/loginOn.jsp</result> </action> </package> 说明:package 中name属性就是个标识符,用于继承的,不与文件夹对应。namespace 与文件夹对应,所以注意是否要加"/"。

此时访问该action路径应该为:

<a href="resource/jsp/first.action">路径加first.action请求struts2</a>对应的目录应该为:

说明:继承包后,路径叠加。无论直接继承于哪个包,都要直接或间接继承于struts-default 包,该包在struts-default.xml中定义,用于配置struts2 相关信息。

3、配置struts 2 中action

略。

四、MVC 理解

JSP /Servlet :

Servlet 可充当控制器;

SpringMVC :

控制器为实现Controller 接口的类,web.xml中配置 DispatcherServlet 的servlet 对象转向对应的<自定义的该servlet名>-servlet.xml(见下面 说明一),再在该xml中定义url 映射bean (如org.springframework.web.servlet.handler.SimpleUrlHandlerMapping类,见说明二)与视图解析bean(如org.springframework.web.servlet.view.InternalResourceViewResolver),以及被管理的控制器bean(也即继承Controller 的类,见 说明二)。

Struts /Structs2 :

控制器为实现Action 接口的子类,通过web.xml中配置StrutsServlet 的servlet 对象或 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter 的过滤器对象转向struts.xml。

不管哪种MVC 实现,其思想差不多都是,在特定的控制器(Action)中处理业务,同时可与对应的页面相关联,处理业务后,返回数据或页面。

说明一:

配置方式:

1、默认为WEB-INF下的"servletName-servlet.xml",假设该servlet取名为dispatcherServlet,则对应配置文件应为dispatcherServle-servlet.xml,且在WEB-INF目录下。

2、使用初始化参数指定xml配置文件位置:

<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定配置文件位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:servletNameConfig.xml</param-value> <!-- 或 <param-value>WEB-INF/servletNameConfig.xml</param-value> --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>多个xml文件使用逗号分隔

说明二:

SpringMVC 中,映射关系也可使用注解方式,见另一篇日志:

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

最新回复(0)