Struts 路径分析以及是否一定要执行excute()方法
一、Struts路径分析。
1.先创建 Struts_PathAction 继承至 ActionSupport ,设置execute()方法的返回值是"path"。
public class Struts_PathAction extends ActionSupport { //路径问题: @Override public String execute() throws Exception { // TODO Auto-generated method stub return "path"; } }
2.配置struts.xml文件,namespace的值设置为“”,action的name与result 一致,使之操作起来更加方便。
<struts> <constant name="struts.devMode" value="true" /> <package name="com.cqvie.path" extends="struts-default" namespace=""> <action name="path" class="com.cqvie.path.Struts_PathAction" > <result name="path">/path.jsp</result> </action> </package> </struts>
3.编辑index.jsp页面,action 的name是“path”。
<body> <a href="path/path.action">Action路径说明问题</a> </body>
4.由上可知,需要创建path.jsp页面。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>">
<title>My JSP 'path.jsp' starting page</title> </head>
<body> struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。 <br /> <a href="index.jsp">index.jsp</a> <br /> 虽然可以用redirect方式解决,但redirect方式并非必要。 <br /> 解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径) <br /> 或者使用myeclipse经常用的,指定basePath </body> </html>
注意:当这样运行时,点击超链接会出现找不到的情况,那是因为path路径有错,按理说需要加上 "../"表示根目录,但是如此一来变会更加麻烦。所以需要得到该action的根目录。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'path.jsp' starting page</title> </head> <body> struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。<br/> <a href="<%=basePath%>index.jsp">index.jsp</a> <br /> 虽然可以用redirect方式解决,但redirect方式并非必要。 <br /> 解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径) <br /> 或者使用myeclipse经常用的,指定basePath </body> </html>
再次运行时,发现可行了
再次点击超链接时,发现又回到了刚才的界面。路径验证成功。
二、struts 中的Action 继承至“ActionSupport” 时,程序会重写excute()方法,且必须要有这个方法,但是是否只能执行这一个方法呢?
1.新建项目ActionMethod
2.创建class ActionMethod,并继承至ActionSupport。(返回值可以直接是常量。)
package com.struts.method;
import com.opensymphony.xwork2.ActionSupport;
//这种方法的返回值可以定义为常量 SUCCESS;因为 Action可以将其转换成常量:String SUCCESS = "success";
public class ActionMethod extends ActionSupport { public String add(){ return SUCCESS;//可以定义为常量。 } }
3.设置index.jsp 页面。由此验证,Action执行的时候并不一定要执行execute方法,可以在配置文件中配置Action的时候用method=来指定执行哪个方法(但是会产生太多的action);也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<a href="<%=context %>/admin/admin!add">添加用户</a>
4.创建 struts_method.jsp,只输出一句话:提示跳转成功
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <base href="<%=basePath%>"> </head> <body> add Admin Success!<br> </body> </html>
5.运行
从地址栏的变化可以看出动态配置 action 的method,也可实现页面跳转,并且成功,由此证明action 并不只是只能执行excute()方法。
三、经验总结、教训。
1.path关乎action的去向,用相对路径容易出错,用绝对路径稍微好些。
2.对于action的excute()方法又有了进一步的认识:以前都只认为它必须要重写此方法才能有效,现在看来不仅不是如此,还可以重新定义自己需要的方法。
3.action的访问路径不复杂,但是今天看了马老师的讲解视频,说不晕是骗人的,对此还得继续温习,熟能生巧。
4.通过这些天的学习,我对struts又有了新的认识,可能不如某些同学收获的多,但是只要自己比昨天好,我就在进步。