【Struts2】二_Struts2参数映射、核心配置文件struts.xml中的标签与属性的使用
创始人
2024-02-01 11:48:20
0

文章目录

      • Struts2
        • 一、参数映射:
          • ▶传递基本数据类型:
          • ▶传递对象
        • 二、核心配置文件struts.xml:
          • 2.1、constant标签
          • 2.2、package标签
          • 2.3、action标签
        • 三、Action配置:
          • 3.1、Action简介:
          • 3.2、继承ActionSupport类:
          • 3.3、动态方法调用:(不安全)
          • 3.4、使用通配符:
          • 3.5、默认Action:
        • 四、Result配置:
          • 4.1、dispatcher
          • 4.2、redirect
          • 4.3、redirectAction
          • 4.4、chain
          • 4.5、动态结果:
          • 4.6、全局结果:
        • package里面标签的顺序:

Struts2


项目的初始配置见:idea快速搭建struts2框架:https://blog.csdn.net/m0_70083523/article/details/127899288
额外的其他jar包,可能会用到:


org.projectlomboklombok1.16.12


javax.servlet.jsp.jstljstl1.2


javax.servletjsp-api2.0provided


javax.servletservlet-api2.5provided

一、参数映射:


▶传递基本数据类型:
public class HelloAction implements Action {@Getter@Setterprivate String name;@Getter@Setterprivate String message;public String execute() throws Exception {System.out.println("hello struts2~~~struts构建完成");System.out.println("接收到的name是===="+name);message="----message----"; //相当于request.SetAttribute();return "OK";  }
}

【读取请求参数的时候使用Set方法,在浏览器页面读取值得时候使用get方法,必须要给属性进行get/set方法】

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>

Hello


struts2


后端读取值:${requestScope.message}

在这里插入图片描述
在这里插入图片描述

▶传递对象

创建实体类User:set/get方法使用了注解

@Getter
@Setter
@ToString
public class User {private Integer id;   //idprivate String userName; //用户名称
}
public class HelloAction implements Action {@Getter@Setterprivate User user;public String execute() throws Exception {System.out.println("hello struts2~~~struts构建完成");System.out.println("user==="+user);return "OK";  //返回的结果}
}

传值:属性名.实体类属性如:user.id

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>


struts2


id:
userName:

在这里插入图片描述

二、核心配置文件struts.xml:


2.1、constant标签






  • constant用来配置常量。name属性是常量名,value属性是常量值。
  • constant常量可以改变Struts2的一些行为,比如UI标签的样式、编码格式等。
  • 因为struts2默认的编码格式就是UTF-8,所以不用特意指定编码,中文也不会乱码
2.2、package标签


package是包。Struts2的package与java中的package类似,可以把同一个业务模块的action和result集中到一个包中,方便管理。不同的是Struts2的包可以继承,比如商品有增删改查操作,订单也有增删该查操作,我们可以将商品和订单的action分别放两个package中方便管理。

  • name属性是包的名字,一个struts.xml中可以有很多个package,通过name属性进行区分。
  • namespace是命名空间,/代表的是根目录。namespace的作用类似于SpringMVC中在Controller类上加@RequestMapping注解。相当于此包中所有的action前都加一个父路径。如:
  • extends属性是继承,通常都会继承struts-default。在struts-default中定义了大星的struts特性,如拦截器和参数处理的功能,如果不继承struts-default,会遇到参数无法绑定或找不到action类。

/index.jsp


在这里插入图片描述

2.3、action标签

index.jsperror.jsplogin.jsp

action标签用来处理请求和响应结果。

  • name属性是请求的名字,此处不需要加.action。同一个package下的action不能重名。
  • class属性指定处理该请求的类,是类的全路径。默认的处理请求时会去类中找名为execute的方法。如果不指定class,将默认ActionSupport为处理请求的类。
  • result标签用来处理请求结果,name属性是Action类中返回的字符串。标签的值是要跳转的页面地址。name如果不写的话,默认是success。

示例:
实体类:

@Data
public class User {private String userName;private String password;
}

UserAction类:

public class UserAction extends ActionSupport {@Getter@Setterprivate User user;public String execute() throws Exception {System.out.println("用户名:" + user.getUserName());System.out.println("密码:" + user.getPassword());if ("admin".equals(user.getUserName()) && "1234567".equals(user.getPassword())) {// 将user对象保存在session中Map session = null;session = ActionContext.getContext().getSession();session.put("user_session", user);return "success";} else {return "error";}}
}

login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

登录


用户名:
密 码:

success.jsp:

<%@ page contentType="text/html;charset=UTF-8"  isELIgnored="false" language="java" %>

登录成功


欢迎您,${sessionScope.get("user_session").userName}

error.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

登录失败


用户名或密码不匹配。

struts.xml:

/success.jsp /fail.jsp 

访问路径:localhost:8080/login

三、Action配置:


3.1、Action简介:

【Struts的业务核心是Action类】前面我们已经使用过了此类实现Action接口

  • 一个Action业务里可以实现Action接口,也可以继承ActionSupport类。在ActionSupport中提供了一些实现好的业务方法。在以后的编程中,建议全部继承ActionSupport类。
  • Action中的方法必须返回一个String类型的字符串,这个字符串与struts.xml中result标签的name属性相对应,struts.xml会根据返回的字符串查找对应的页面。
3.2、继承ActionSupport类:

下面讲述继承ActionSupport类的使用:

可以存在多个方法且可自定义,但是都得返回String类型:
创建ActionTest类:

public class TestAction extends ActionSupport {@Setter@Getterprivate User user;//登录的方法public String login() {System.out.println("登录方法 ");return SUCCESS;}//注册的方法public String register() {System.out.println("注册方法 ");return SUCCESS;}
}

struts.xml的配置:


/index.jsp/index.jsp

action标签method属性:调用具体是类中的哪个方法(method=“方法名”)

  • method="login"表示要调用类中的login()方法处理请求。如果找不到login()方法,默认会去找execute()方法,在找不到,报错。
3.3、动态方法调用:(不安全)

如果一个类中有多个业务方法,又不想给每个业务方法都配置一个action标签,可以使用动态方法调用,语法是:请求名!方法名.action

  • 当请求的格式是user!login.action时,代表调用UserAction中的login()方法处理当前请求。
  • 当请求的格式是user!regist.action时,代表调用UserAction中的regist()方法处理当前请求。

Struts2中可以开启调用动态方法,设置的常量为:





 login,regist/index.jsp

登录访问路径:localhost:8080/user/user!login
注册访问路径:localhost:8080/user/user!register

3.4、使用通配符:

另—种减少action数量的方法是使用通配符:

 login,regist/index.jsp{1}.jsp

name属性值为*User就是匹配以User结束的请求,method="{1}"中的{1}匹配的就是User中的*

  • 登录访问路径:localhost:8080/user/loginUser
  • 注册访问路径:localhost:8080/user/registerUser
3.5、默认Action:

如果在struts.xml中找不到匹配的action,将会报错。可以设置一个默认的action,当所有请求都不匹配时,将匹配默认action。



/error.jsp

  • < default-action-ref>对当前的package有效。
  • action标签的class省略调用的ActionSupport类,result的name省略将默认为success。
  • 注意default-actiop-ref必须在所有的action标签上面。也就是说default-action-ref出现在action标签之前。不然不符合DTD验证。

四、Result配置:


【常用结果有三种类型: dispatcher、redirect、redirectAction、chain】

4.1、dispatcher

result的默认类型就是dispatcher。以下两个标签是等价的:

index.jsp
index.jsp
  • dispatcher的结果等同于Servlet中的请求转发,即:request.getRequestDispatcher(“success.jsp”).forward(request, response);
  • 请求转发的意思是当前请求中的参数、属性在下一个页面或请求中仍然可以使用。
4.2、redirect

redirect是重定向,重定向之后,当前请求中的参数和属性在下一个页面或请求中将不能使用。

index.jsp

相当于Servlet中的:response.sendRedirect(“success.jsp”); 地址栏改变

4.3、redirectAction

redirectAction与redirect类似,不过redirectAction是重定向到某一个action
主要redirectAction的action后缀是action

login.action 

如果要调用不同package下的action,需要在result中传参数:


 
/userhello.action123login.jsp

此时访问路径:localhost:8080/test就会跳转到localhost:8080/user/hello.do

4.4、chain

redirectAction不能共享request中的数据,如果想共享数据,可以将type设置为chain。
注意chain的action后面没有后缀

hello

4.5、动态结果:

动态结果是根据某个属性不同的值返回到不同页面。

@Data
private String username;
@Data
private string page;
Ipublic String login() {//参数和业务略System.out.println("我是登录");if ("admin".equals(username)) {	//管理员去管理页page = "admin_page";}else {		//其他人去用户页page = "user_page";}return SUCCESS;
}
${page}.jsp

访问路径:

  • localhost:8080/page?page=admin_page 返回管理员管理页面
  • localhost:8080/page?page=user_page 返回用户使用页面
  • 可以用来设置访问权限
4.6、全局结果:

一个action中的result只能在当前action中有效。如果多数的action中都用到同一个结果,可以将此结果定义为全局结果。比如index代表用户没有登录,需要跳转到登录页面,那么可以设置成全局结果:

index.jsp

如果action中定义了与全局结果同名的result,将优先action标签中的。
注意global-results在action之前,default-action-ref之后。

在这里插入图片描述

package里面标签的顺序:

? 代表出现0次或1次
星号 代表0次或多次

  1. result-types?
  2. interceptors?
  3. default-interceptor-ref?
  4. default-action-ref?
  5. default-class-ref?
  6. global-results?
  7. global-exception-mappings?
  8. action*

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...