struts2简单例子_简述struts2执行流程

(1) 2024-09-04 13:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
struts2简单例子_简述struts2执行流程,希望能够帮助你!!!。

一、Struts和Struts2的背景

什么是Struts呢?

我们这样认为:Struts是流行和成熟的基于MVC设计模式的Web应用程序框架,能够帮助我们减少用MVC设计模式来开发Web应用的时间。

可能有些小伙伴会问了,什么是MVC呢?如下:

struts2简单例子_简述struts2执行流程_https://bianchenghao6.com/blog__第1张

那什么又是Struts2呢?

我这样理解的:Struts2是结合Struts1和webwork的一个升级版,在稳定性以及性能等各个方面都比Struts1和webwork好,可谓集两者之所长。

二、Struts2的工作原理

上面这幅图是Struts2的工作原理图,Struts2是在我们的web.xml中进行配置的一个过滤器,当我们web项目启动的时候,过滤器就会生效。

首先,用户通过HttpServletRequest用户请求,经过一系列的Struts2核心的过滤器向下执行。

①.ActionContextCleanUp是其中的一个可选的过滤器,非必须的哦;

②.Other filters(SiteMesh,etc)过滤器主要是用于与其他的框架进行集成;③.FilterDispatcher也是Struts2的一个核心过滤器,我们需要知道的是在Struts2.1.2之前是FilterDispatcher,而在Struts2.1.3版本之上被改为StrutsPrepareAndExecuteFilter。

可能有人要问了,为什么FilterDispatcher会被StrutsPrepareAndExecuteFilter替代呢?

举个例子:假如我们现在想写一个过滤器,我们往往会放在Struts2核心的过滤器的顶端,也就是在ActionContextCleanUp执行之前,写我们自己的Filter;假如说我们需要在Struts2拦截之后再写过滤器,也就是说我在执行Action之前,编写过滤器。通过FilterDisoatcher是做不到的, 而升级版的StrutsPrepareAndExecuteFilter就可以做到在执行Action之前,添加我们自己的过滤器。

然后,如果后缀名为.action的就会进入ActionMapper,请求并在ActionMapper查找我们这个请求有没有指定的一个Action,假如说有的话,就返回上一个过滤器并向左边走。当走到ActionProxy的时候,ActionProxy就可以通过ConfigurationManager读取到struts.xml,并找到具体的Action类,又通过ActionProxy的代理,创建我们action的一个反向的实例。

再然后,经过一系列的拦截器之前,执行到我们的Action,返回到Result(也是一个字符串对象),这个字符串对应的就是我们的视图,也就是图上的Template,包括jsp,FreeMarker等等。再经过一系列的拦截器之后,通过HttpServletResponse返回到HttpServletRequest中,也就是返回到用户的实例进行显示。

三、案例:利用Struts2接收页面参数

首先,我们分别讨论使用三种方式接受参数:

1.使用Action的属性接收参数

2.使用DomainModel接收参数

3.使用ModelDriven接收参数

准备工作:

success.jsp:

  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'success.jsp' starting page</title>
  11. </head>
  12. <body>
  13. This is success.jsp. <br>
  14. </body>
  15. </html>

index.jsp:

  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'index.jsp' starting page</title>
  11. </head>
  12. <body>
  13. <form action="Loginaction.action" method="post">
  14. 用户名:<input type="text" name="username" /><br>
  15. 密码:<input type="password" name="password" /><br>
  16. <input type="submit" value="提交" />
  17. </form>
  18. </body>
  19. </html>

配置struts.xml:

  1. <action name="Loginaction" method="login" class="com.action.IndexAction">
  2. <result>/success.jsp</result>
  3. </action>

1.使用Action的属性接收参数

首先我们新建一个IndexAction.java并继承ActionSupport:

  1. public class IndexAction extends ActionSupport{
  2. private String username;//用户名
  3. private String password;//密码
  4. public String getUsername() {
  5. return username;
  6. }
  7. public void setUsername(String username) {
  8. this.username = username;
  9. }
  10. public String getPassword() {
  11. return password;
  12. }
  13. public void setPassword(String password) {
  14. this.password = password;
  15. }
  16. public String login(){
  17. System.out.println(username);
  18. return SUCCESS;
  19. }
  20. }

然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。这说明了我们已经能够通过这种方式获取参数了,但是假如我们有些页面非常的大,有几十个甚至上百个,那么这个时候我们是不是要建上百个属性呢?所以这种方法对于我们开发是非常复杂的,当然也不利于维护。

曾经我们说过,Java是一种面向对象的语言,那么我们能不能把这些属性放在一个对象里面,来实现各方面的开发呢?答案是肯定可以的。这就牵扯到我们的第二种方式:

2.使用DomainModel接收参数

修改后的IndexAction.java:

  1. public class IndexAction extends ActionSupport{
  2. private User user;
  3. public User getUser() {
  4. return user;
  5. }
  6. public void setUser(User user) {
  7. this.user = user;
  8. }
  9. public String login(){
  10. System.out.println(user.getUsername());
  11. return SUCCESS;
  12. }
  13. }

独立出来的用户(User)类:

  1. /**
  2. * 用户实体类
  3. */
  4. public class User {
  5. private String username;//用户名
  6. private String password;//密码
  7. public String getUsername() {
  8. return username;
  9. }
  10. public void setUsername(String username) {
  11. this.username = username;
  12. }
  13. public String getPassword() {
  14. return password;
  15. }
  16. public void setPassword(String password) {
  17. this.password = password;
  18. }
  19. }

现在我们停下来想一下,假如说我们现在什么都不改,那么我们通过jsp中的提交方式能不能自动往private User user;里面传递参数呢?答案是肯定不行的,因为假如说我们有多个对象,每个对象都有这样的参数的话,它传递到private User user;里面的参数都赋值的话,就肯定会乱。那么我们怎么指定呢?我们可以修改index.jsp里面的属性名称:

  1. <form action="Loginaction.action" method="post">
  2. 用户名:<input type="text" name="user.username" /><br>
  3. 密码:<input type="password" name="user.password" /><br>
  4. <input type="submit" value="提交" />
  5. </form>

这样就代表我们的username和password是出入到private User user;这个参数对象里面的,而不是其他的参数对象里面。

然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。说明这种方式也是可行的。

3.使用ModelDriven接收参数

修改后的IndexAction.java:

  1. public class IndexAction extends ActionSupport implements ModelDriven<User>{
  2. private User user=new User();//必须实例化,并且去掉getters和setters方法
  3. public String login(){
  4. System.out.println(user.getUsername());
  5. return SUCCESS;
  6. }
  7. @Override
  8. public User getModel() {
  9. return user;
  10. }
  11. }

然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。

如果说我们传入的参数是一个集合怎么办呢?我们可以这样:

向User.java里面添加一个成员变量,并实现getters和setters方法:

  1. private List<String> booklist;
  2. public List<String> getBooklist() {
  3. return booklist;
  4. }
  5. public void setBooklist(List<String> booklist) {
  6. this.booklist = booklist;
  7. }

修改后的index.jsp:

  1. <form action="Loginaction.action" method="post">
  2. 用户名:<input type="text" name="username" /><br>
  3. 密码:<input type="password" name="password" /><br>
  4. 书籍1:<input type="text" name="booklist[0]" /><br>
  5. 书籍2:<input type="text" name="booklist[1]" /><br>
  6. <input type="submit" value="提交" />
  7. </form>

修改后的IndexAction.java:

  1. public class IndexAction extends ActionSupport implements ModelDriven<User>{
  2. private User user=new User();
  3. public String login(){
  4. System.out.println(user.getUsername());
  5. System.out.println(user.getBookList().get(0));
  6. System.out.println(user.getBookList().get(1));
  7. return SUCCESS;
  8. }
  9. @Override
  10. public User getModel() {
  11. return user;
  12. }
  13. }

再次启动tomcat并运行程序,控制台成功打印输出。那么如果private List<String> booklist→private List<User> booklist呢?也就是说传入的是一个对象呢?怎么修改index.jsp和IndexAction.java来测试是否成功呢?这个问题就留给读者们思考啦。

经过三种传参的对比,在实际应用中我们一般使用ModelDriven接收参数,为什么呢?因为低耦合高内聚啊。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复