java

位置:IT落伍者 >> java >> 浏览文章

Struts2通配符映射


发布日期:2018年11月19日
 
Struts2通配符映射
struts的关于method={}意思详解

<action name= Login_* method= {} class= mailreaderLogin >

中Login_*带*是什么意思?method= {} 带{}这个是什么意思?

====================================================

name= Login_*

代表这个action处理所有以Login_开头的请求

method= {}

根据前面请求Login_methodname调用action中的以methodname命名的方法

class= mailreaderLogin

action的类名称

如jsp文件中请求Login_validateUser的action名称根据上面配置调用action类mailreaderLogin类中方法validateUser()

又如

对于Login_update请求将会调用mailreaderLogin的update()方法

它的用法同webwork中的!符号的作用相当于是一个通配符

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

struts中的路径问题

注意在jsp中/表示tomcat服务器的根目录在strutsxml配置文件中/表示webapp的根路径即MyEclipse web项目中的WebRoot路径

总结

struts中的路径问题是根据action的路径而不是jsp路径来确定所以尽量不要使用相对路径

虽然可以用redirect方式解决但redirect方式并非必要

解决办法非常简单统一使用绝对路径 (在jsp中用requestgetContextRoot方式来拿到webapp的路径)

或者使用myeclipse经常用的指定basePath

Action Method

配置

<package name=user extends=strutsdefault namespace=/user>

<action name=userAdd class=combjsxtstrutsuseractionUserAction method=add>

<result>/user_add_successjsp</result>

</action>

<action name=user class=combjsxtstrutsuseractionUserAction>

<result>/user_add_successjsp</result>

</action>

</package>

总结

Action执行的时候并不一定要执行execute方法

可以在配置文件中配置Action的时候用method=来指定执行哪个方法(前者方法)

也可以在url地址中动态指定(动态方法调用DMI )(推荐)(后者方法)

<a <%=context %>/user/userAdd>添加用户

<br />

<a <%=context %>/user/user!add>添加用户

<br />

前者会产生太多的action所以不推荐使用(注<% String context = requestgetContextPath(); %>)

再给个案例大概介绍!使用动态调用DMI的方法即通过!+方法名的指定方法

UserActionjava

import comopensymphonyxworkActionContext;

import javautilMap;

public class UserAction {

private String userName;

private String password;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

thisuserName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

thispassword = password;

}

public String execute(){

if(!userNameequals(aa)||!passwordequals(aa)){

return error;

}else{

Map session=(Map)ActionContextgetContext()getSession();

sessionput(userName userName);

return success;

}

}

public String loginOther(){

if(!userNameequals(bb)||!passwordequals(bb)){

return error;

}else{

Map session=(Map)ActionContextgetContext()getSession();

sessionput(userName userName);

return success;

}

}

}

strutsxml

<?xml version= encoding=UTF?>

<!DOCTYPE struts PUBLIC

//Apache Software Foundation//DTD Struts Configuration //EN

dtd>

<struts>

<package name=default extends=strutsdefault>

<action name=struts class=orgactionStrutsAction>

<result name=success>/welcomejsp</result>

<result name=error>/hellojsp</result>

<result name=input>/hellojsp</result>

</action>

<action name=user class=orgactionUserAction>

<result name=success>/login_welcomejsp</result>

<result name=error>/login_errorjsp</result>

</action>

<!<action name=loginOther class=orgactionUserAction method=loginOther>

<result name=success>/login_welcomejsp</result>

<result name=error>/login_errorjsp</result>

</action>

>

</package>

</struts>

login_welcomejsp

<%@ page language=java import=javautil* pageEncoding=utf%>

<%@ taglib uri=/strutstags prefix=s %>

<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>

<html>

<head>

<title>欢迎</title>

<meta httpequiv=pragma content=nocache>

<meta httpequiv=cachecontrol content=nocache>

<meta httpequiv=expires content=>

<meta httpequiv=keywords content=keywordkeywordkeyword>

<meta httpequiv=description content=This is my page>

<!

<link rel=stylesheet type=text/css >

>

</head>

<body>

<s:set value=#sessionuserName name=userName />

你好!<s:property value=#userName/>

</body>

</html>

login_errorjsp

<%@ page language=java import=javautil* pageEncoding=UTF%>

<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>

<html>

<head>

<title>登陆失败</title>

<meta httpequiv=pragma content=nocache>

<meta httpequiv=cachecontrol content=nocache>

<meta httpequiv=expires content=>

<meta httpequiv=keywords content=keywordkeywordkeyword>

<meta httpequiv=description content=This is my page>

<!

<link rel=stylesheet type=text/css >

>

</head>

<body>

很抱歉!你的登陆失败了!请重新<a >登陆

</body>

</html>

loginjsp

<%@ page language=java import=javautil* pageEncoding=utf%>

<%@ taglib uri=/strutstags prefix=s %>

<%

String path = requestgetContextPath();

String basePath = requestgetScheme()+://+requestgetServerName()+:+requestgetServerPort()+path+/;

%>

<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>

<html>

<head>

<base <%=basePath%>>

<title>struts 应用</title>

<meta httpequiv=pragma content=nocache>

<meta httpequiv=cachecontrol content=nocache>

<meta httpequiv=expires content=>

<meta httpequiv=keywords content=keywordkeywordkeyword>

<meta httpequiv=description content=This is my page>

<!

<link rel=stylesheet type=text/css >

>

</head>

<body>

<s:form action=user!loginOther method=post> 红色部分你如果想调用userAction中的loginOther方法而不想调用execute方法 直接通过 !+方法名即可那你就不用再设置strutsxml中注释掉的部分了这样可以不产生太多的action

<s:textfield name=userName label=请输入姓名 ></s:textfield> <s:textfield name=password label=请输入密码></s:textfield>

<s:submit value=提交></s:submit>

</s:form>

</body>

</html>

Action Wildcard(Action 通配符)

配置

<package name=actions extends=strutsdefault namespace=/actions>

<action name=Student* class=combjsxtstrutsactionStudentAction method={}>

<result>/Student{}_successjsp</result>

</action>

<action name=*_* class=combjsxtstrutsaction{}Action method={}>

<result>/{}_{}_successjsp</result>

<! {}_successjsp >

</action>

</package>

{}{}表示第一第二个占位符

*为通配符

通过action name的通配匹配获得占位符可以使用占位符放在result和methodclass中替代匹配的字符

总结

使用通配符将配置量降到最低

<a <%=context %>/actions/Studentadd>添加学生

<a <%=context %>/actions/Studentdelete>删除学生

不过一定要遵守约定优于配置的原则

<a <%=context %>/actions/Teacher_add>添加老师

<a <%=context %>/actions/Teacher_delete>删除老师

<a <%=context %>/actions/Course_add>添加课程

<a <%=context %>/actions/Course_delete>删除课程

接收参数值

使用action属性接收参数

只需在action加入getter/setter方法如参数name=a接受到参数必须有getName/setName方法

链接<a user/user!add?name=a&age=>

public class UserAction extends ActionSupport {

private String name;

private int age;

public String add() {

Systemoutprintln(name= + name);

Systemoutprintln(age= + age);

return SUCCESS;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

thisage = age;

}

}

使用Domain Model接收参数

将之前的属性放入到POJO 并设置属性的setter/getter方法

链接使用Domain Model接收参数<a user/user!add?username=a&userage=>添加用户

public class UserAction extends ActionSupport {

private User user;

//private UserDTO userDTO;

public String add() {

Systemoutprintln(name= + usergetName());

Systemoutprintln(age= + usergetAge());

return SUCCESS;

}

public User getUser() {

return user;

}

public void setUser(User user) {

thisuser = user;

}

}

public class User {

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

thisage = age;

}

}

使用ModelDriven接收参数

Action实现ModelDriven接口实现getModel()方法

这样user需要自己new出来getModel返回user

链接使用ModelDriven接收参数<a user/user!add?name=a&age=>添加用户

public class UserAction extends ActionSupport implements ModelDriven<User> {

private User user = new User();

public String add() {

Systemoutprintln(name= + usergetName());

Systemoutprintln(age= + usergetAge());

return SUCCESS;

}

@Override

public User getModel() {

return user;

}

}

字符编码

配置

<constant name=strutsinencoding value=GBK /> <! internationalization >

在struts中不起作用属于bug在struts中修改

解决方案

修改webxml 中

<filter>

<filtername>struts</filtername>

<! struts中使用filter >

<!<filterclass>orgapachestrutsdispatcherngfilterStrutsPrepareAndExecuteFilter</filterclass>>

<! struts中使用的filter >

<filterclass>orgapachestrutsdispatcherFilterDispatcher</filterclass>

</filter>

=============================================================

Struts一个Action内包含多个请求处理方法的处理(三种方式)

Struts提供了DispatchAction从而允许一个Action内包含多个请求处理方法Struts也提供了类似的功能处理方式主要有以下三种方式

动态方法调用

DMIDynamic Method Invocation 动态方法调用

动态方法调用是指表单元素的action不直接等于某个Action的名字而是以如下形式来指定对应的动作名

<form method=post action=userOpt!loginaction>

则用户的请求将提交到名为userOpt的Action实例Action实例将调用名为login方法来处理请求同时login方法的签名也是跟execute()一样即为public String login() throws Exception

注意要使用动态方法调用必须设置Struts允许动态方法调用通过设置strutsenableDynamicMethodInvocation常量来完成该常量属性的默认值是true

示例

修改用户登录验证示例多增加一个注册用户功能

修改Action类

package orgqiujywebstrutsaction;

import comopensymphonyxworkActionContext;

import comopensymphonyxworkActionSupport;

/**

*@authorqiujy

*@version

*/

publicclass LoginAction extends ActionSupport{

private String userName;

private String password;

private String msg; //结果信息属性

上一篇:Spring MVC学习之注解介绍

下一篇:安装配置Jboss完全篇