struts2学习——2.Struts2配置

目录

一.Struts2基本架构
二.Struts2配置文件
三.配置Action
四.动态方法调用
五.配置Result


https://github.com/fulq1234/mystudy/tree/master/struts

一.Struts2基本架构


快捷键ctrl+alt+H,搜索StrutsPrepareAndExecuteFilter

二.Struts2配置文件

struts.xml
1.核心配置文件,主要负责管理Action
2.通常放在WEB-INF/classes,在该目录下面struts.xml可以被自动加载

struts.xml头部代码寻找方法:

jar包struts2-core-2.3.34.jar 下面有struts-2.3.dtd,这里面有struts.xml的头部怎么写的示例

<struts>
  <constant name="" value=""/><!--常量-->
  <package name="" namespace="" extends="">
    <action name="" class="">
       <result name=""></result>
    </action>
  </package>
</struts>
constant元素
1.配置常量,可以改变Struts2框架的一些行为

2.name属性表示常量名称,value属性表示常量值

这些默认值放置位置struts2-core-2.3.34.jar,下面有/org/apache/struts2/default.properties


package元素
1.包的作用:简化维护工作,提高重用性
2.包可以“继承”已定义的包,并可以添加自己包的配置
3.name属性为必需的且唯一,用于指定包的名称
4.extends属性指定要扩展的包
5.namespace属性定义该包中action的命名空间,可选


除非有令人信服原因,自定义的包应该总是扩展struts-default包

Action在同一个包(package)里面,是不能同名的

namespace是访问路径的前缀。举例下面方法action的路径是“/user/helloworld”

<package name="default" namespace="/user" extends="struts-default">
   <action name="helloworld" class="cn.HelloWorld">
       <result name="success">/helloWorld.jsp</result>
   </action>
</package>

1.struts-default.xml
  Struts2默认配置文件,会自动加载
  struts-default包在struts-default.xml文件中定义
2.struts-plugin.xml

  Struts2 插件使用的配置文件

加载顺序:



三.配置Action

Action的作用
1.封装工作单元
2.数据转移的场所
3.返回结果字符串
method属性
1.默认值:execute

2.更改属性值实现Action中不同方法的调用

controller

package cn.intro.action;

public class UserAction{	
	public String login(){
		return "alogin";
	}
	public String register(){
		return "aregister";
	}
}

struts.xml

<package name="user" namespace="/user" extends="struts-default">
		<action name="login" class="cn.intro.action.UserAction" method="login">
			<result name="alogin">/login.jsp</result><!--WebContent下面有login.jsp文件-->
		</action>
		<action name="register" class="cn.intro.action.UserAction" method="register">
			<result name="aregister">/register.jsp</result><!--WebContent下面有register.jsp文件-->
		</action>
</package>

访问地址如下:

http://localhost:8080/ch01/user/register

http://localhost:8080/ch01/user/register.action

http://localhost:8080/ch01/user/login

http://localhost:8080/ch01/user/login.action



配置默认Action

1.没有Action匹配请求时,默认Action将被执行

2.通过<default-action-ref ... />元素配置默认Action

<struts>
  <package name="default" extends="struts-default">
      <default-action-ref name="defaultAction"/>
      <action name="defaultAction"><!--省略class属性,将使用ActionSupport类。并且两个“defaultAction”必须能对应上-->
          <result>error.jsp</result>
      </action>
  </package>
</struts>

四.动态方法调用

动态方法调用
作用:减少Action数量
使用: actionName!methodName.action

禁用: 将属性struts.enable.DynamicMethodInvocation设置false

controller

package cn.intro.action;

public class UserAction{	
	public String login(){
		return "alogin";
	}
	public String aa(){
		return "aregister";
	}
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<!-- 启用动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
		
	<package name="user" namespace="/aa" extends="struts-default">		
		<action name="user" class="cn.intro.action.UserAction">
			<result name="alogin">/login.jsp</result>
			<result name="aregister">/register.jsp</result>
		</action>
	</package>
</struts>

访问的url:

http://localhost:8080/ch01/aa/user!aa.action

http://localhost:8080/ch01/aa/user!login.action


调用方法user!login.action调用UserAction的login()方法

简化Action配置另一种形式的动态方法调用(使用通配符*)

<action name="*User" class="cn.UserAction" method="{1}">
   <result>/page/{1}_success.jsp</result>
   <result name="input">/page/{1}.jsp</result>
</action>

解释。如果*是add,{1}就是add

举例:

controller

package cn.intro.action;

public class UserAction{	
	public String add(){
		return "input";
	}
	public String dele(){
		return "input";
	}
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<!-- 启用动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>	
	<package name="user" namespace="/" extends="struts-default">		
		<action name="*User" class="cn.intro.action.UserAction" method="{1}">
			<!-- <result>{1}_success.jsp</result> -->
			<result name="input">{1}.jsp</result>
		</action>
	</package>
</struts>

在WebContent增加页面add.jsp和dele.jsp

访问方法

http://localhost:8080/ch01/addUser.action

http://localhost:8080/ch01/deleUser.action


五.配置Result



Result常用结果类型
1.dispatcher:默认结果类型,后台使用RequestDispatcher转发请求
2.redirect:后台使用的sendRedirect()将请求重定向至指定的URL
3.redirectAction:主要用于重定向到Action

<action name="*User" class="cn.UserAction" method="{1}">
   <result name="input">/page/{1}.jsp</result>
   <result type="redirect">/page/{1}_success.jsp</result>
</action>

controller

package cn.intro.action;

public class UserAction{	
	private String id = "";//接收的页面的参数
	private String message = "";//返回到页面的参数
	//... ...id,message的getter/setter方法
	public String add(){
		if(id.length() == 0){
			this.message = "操作失败";
			return "input";
		}else{
			this.message = "操作成功";
			return "success";
		}
	}
	public String dele(){
		return "input";
	}
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<!-- 启用动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>	
	<package name="user" namespace="/" extends="struts-default">		
		<action name="*User" class="cn.intro.action.UserAction" method="{1}">
			<result>{1}_success.jsp</result>
			<result name="input" type="redirect">{1}.jsp</result>
		</action>
	</package>
</struts>

add_success.jsp

<%@taglib prefix="s" uri="/struts-tags" %>
<body>
<s:property value="message"/>
<s:form action="/addUser.action" method="">
	<s:textfield name="id"></s:textfield>
	<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>

还有add.jsp


访问http://localhost:8080/ch01/add_success.jsp

输入框空的时候,跳转到add.jsp页面,有值得时候,跳转到add_success.jsp页面

全局结果
实现同一个包中多个action共享一个结果

<struts>
  <package name="default" extends="struts-default">
  <global-results>
	<result name="error">/page/error.jsp</result>
	<result name="login" type="redirect">/page/login.jsp</result>
  </global-results>
  ...省略action的配置...
  </package>
</struts>

动态调用(redirectAction)

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<!-- 启用动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
	
	<package name="user" namespace="/" extends="struts-default">
		
		<!-- 演示动态结果,${nextDispose}表示调用Action的getNextDispose()的方法。获取学员的方法。 -->
		<action name="doLogin" class="cn.intro.action.UserAction" method="doLogin">
			<result type="redirectAction">${nextDispose}</result>
		</action>
		
		<action name="manager">
			<result>manager.jsp</result>
		</action>
		
		<action name="common">
			<result>common.jsp</result>
		</action>
	</package>
</struts>

login.jsp

<%@taglib prefix="s" uri="/struts-tags" %>
<s:form action="doLogin.action" method="post" theme="xhtml">
	<s:textfield name="name" value="xx" label="用户名"></s:textfield>
	<s:password name="password" label="密码"></s:password>
	<s:checkbox name="manager" label="管理员登录"/>
	<s:submit value="提交"/>
</s:form>



有两个文件:common.jsp, manager.jsp

UserAction.java

package cn.intro.action;

public class UserAction{	
	
	private String nextDispose = "";
	private boolean manager;
	//用户登录的逻辑
	public String doLogin(){
		//省略的登录的逻辑
		if(isManager()){
			nextDispose = "manager";
		}else{
			nextDispose = "common";
		}
		return "success";
	}
	//nextDispose,manger的getter/setter方法
}

运行效果:访问:http://localhost:8080/ch01/login.jsp

如果勾选了复选框,点击登录,就出现manager.jsp页面;如果不勾选复选框,点击登录,就出现common.jsp页面。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值