采用命名空间可以区分不同action下面相同的函数名称
我们来看下面的一个程序的代码
我们来看下面的代码:
添加物料的action处理类:
package com.weiyuan.test; public class ItemAction { private String itemName; private String itemMessage; public String getItemName() { return itemName; } public void setItemName(String itemName) { this.itemName = itemName; } public String getItemMessage() { return itemMessage; } public void setItemMessage(String itemMessage) { this.itemMessage = itemMessage; } public String execute() throws Exception{ return "success"; } }
添加用户的action处理类:
package com.weiyuan.test; /** * struct2的action可以不继承任何框架的接口 * 1、默认调用的是execute()方法 * */ public class LoginAction { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() throws Exception{ if("admin".equals(username)&&"admin".equals(password)){ return "success"; }else{ return "error"; } } }
对应的添加成功的jsp文件
add_item_sucess.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> 登陆物料成功 </body> </html>
对应的添加用户成功的jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> 添加用户成功 </body> </html>
程序入口对应的jsp文件入口:index.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <h1>添加用户</h1> <form action="user/add.action" method="post"> 用户代码:<input type="text" name="username"><br> 用户名称:<input type="text" name="password"><br> <input type="submit" value="添加"> </form> <hr> <h1>添加物料</h1> <form action="item/add.action" method> 物料代码:<input type="text" name="itemName"><br> 物料名称:<input type="text" name="itemMessage"><br> <input type="submit" value="添加"> </form> </body> </html>
我们来看看配置文件的struct,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>
<!-- 需要继承extends="struts-default",否则struct2的拦截器就无法使用 -->
<package name="user_struct" extends="struts-default" namespace="/user">
<action name="add" class="com.weiyuan.test.LoginAction">
<result name="success">add_user_sucess.jsp</result>
</action>
</package>
<package name="item_struct" extends="struts-default"namespace="/item">
<action name="add" class="com.weiyuan.test.ItemAction">
<result name="success">add_item_sucess.jsp</result>
</action>
</package>
</struts>
这里很关键:有两个地址需要注意
我们不同的模块配置使用了不同的包名:用户模块对应的包名是package name="user_struct"
物理模块对应的包名是:package name="item_struct"
第二我们使用了命名空间,在user模块中我们提供了 namespace="/user" 在物理模块提供的命令空间是namespace="/item"
注意命名空间必须以/开头
这样在不同的命名空间下我们可以使用相同函数名的action
我们的action都以add开头
在jsp中访问action的时候,因为引入了命名空间,我们访问方式就是命名空间加上action的形式
<form action="user/add.action" method="post">
<form action="item/add.action" method>
上面就是访问命名空间为user下的add这个action
Struts2命名空间和字符集设置
采用命名空间,可以区分不同的包下相同的Action名称
如果package的namespace属性没有指定,使用的默认命名空间为“”
Struts2中Action的完整路径应该为:namespace+Action的名称
首先在指定的命名空间下查找Action,如果找到了就使用此Action,如果没有找到在上层目录中查找,一直到
根(缺省命名空间),在此过程中如果找到了Action就会使用此Action,如果都没有找到就会抛出Action没有找到异常
2、struct配置对应的字符集编码的问题