什么是Struts呢?

我们这样认为:Struts是盛行和成熟的基于MVC设计模式的Web运用程序框架,能够帮助我们减少用MVC设计模式来开拓Web运用的韶光。

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

jsp如何修改项目名称Struts2的入门运用 NoSQL

那什么又是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:

<%@ page language=\"大众java\公众 import=\"大众java.util.\"大众 contentType=\"大众text/html; charset=utf-8\"大众%><%String path = request.getContextPath();String basePath = request.getScheme()+\公众://\"大众+request.getServerName()+\公众:\公众+request.getServerPort()+path+\公众/\"大众;%> <!DOCTYPE HTML PUBLIC \"大众-//W3C//DTD HTML 4.01 Transitional//EN\"大众><html> <head> <base href=\"大众<%=basePath%>\"大众> <title>My JSP 'success.jsp' starting page</title> </head> <body> This is success.jsp. <br> </body></html>

index.jsp:

<%@ page language=\"大众java\"大众 import=\公众java.util.\"大众 contentType=\"大众text/html; charset=utf-8\"大众%><%String path = request.getContextPath();String basePath = request.getScheme()+\"大众://\公众+request.getServerName()+\"大众:\"大众+request.getServerPort()+path+\"大众/\"大众;%> <!DOCTYPE HTML PUBLIC \"大众-//W3C//DTD HTML 4.01 Transitional//EN\"大众><html> <head> <base href=\"大众<%=basePath%>\"大众> <title>My JSP 'index.jsp' starting page</title> </head> <body> <form action=\公众Loginaction.action\公众 method=\"大众post\公众> 用户名:<input type=\"大众text\"大众 name=\"大众username\公众 /><br> 密码:<input type=\"大众password\"大众 name=\"大众password\公众 /><br> <input type=\"大众submit\"大众 value=\公众提交\公众 /> </form> </body></html>

配置struts.xml:

<action name=\公众Loginaction\"大众 method=\"大众login\"大众 class=\"大众com.action.IndexAction\"大众> <result>/success.jsp</result> </action>

1.利用Action的属性吸收参数

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

public class IndexAction extends ActionSupport{ 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 login(){ System.out.println(username); return SUCCESS; }}

然后启动tomact,运行程序,我们可以看到后台有输出,并且页面成功跳转。
这解释了我们已经能够通过这种办法获取参数了,但是如果我们有些页面非常的大,有几十个乃至上百个,那么这个时候我们是不是要建上百个属性呢?以是这种方法对付我们开拓是非常繁芜的,当然也不利于掩护。

曾经我们说过,Java是一种面向工具的措辞,那么我们能不能把这些属性放在一个工具里面,来实现各方面的开拓呢?答案是肯定可以的。
这就牵扯到我们的第二种办法:

2.利用DomainModel吸收参数

修正后的IndexAction.java:

public class IndexAction extends ActionSupport{ private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String login(){ System.out.println(user.getUsername()); return SUCCESS; }}

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

/ 用户实体类 /public class User { 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; }}

现在我们停下来想一下,如果说我们现在什么都不改,那么我们通过jsp中的提交办法能不能自动往private User user;里面通报参数呢?答案是肯定弗成的,由于如果说我们有多个工具,每个工具都有这样的参数的话,它通报到private User user;里面的参数都赋值的话,就肯定会乱。
那么我们怎么指定呢?我们可以修正index.jsp里面的属性名称:

<form action=\"大众Loginaction.action\公众 method=\公众post\"大众>用户名:<input type=\"大众text\"大众 name=\"大众user.username\"大众 /><br>密码:<input type=\公众password\公众 name=\"大众user.password\"大众 /><br><input type=\公众submit\"大众 value=\"大众提交\"大众 /></form>

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

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

3.利用ModelDriven吸收参数

修正后的IndexAction.java:

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

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

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

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

private List<String> booklist; public List<String> getBooklist() { return booklist; } public void setBooklist(List<String> booklist) { this.booklist = booklist; }

修正后的index.jsp:

<form action=\"大众Loginaction.action\"大众 method=\"大众post\"大众> 用户名:<input type=\"大众text\"大众 name=\公众username\"大众 /><br> 密码:<input type=\"大众password\"大众 name=\公众password\"大众 /><br> 书本1:<input type=\"大众text\"大众 name=\"大众booklist[0]\"大众 /><br> 书本2:<input type=\"大众text\"大众 name=\公众booklist[1]\"大众 /><br> <input type=\"大众submit\"大众 value=\"大众提交\"大众 /> </form>

修正后的IndexAction.java:

public class IndexAction extends ActionSupport implements ModelDriven<User>{ private User user=new User(); public String login(){ System.out.println(user.getUsername()); System.out.println(user.getBookList().get(0)); System.out.println(user.getBookList().get(1)); return SUCCESS; } @Override public User getModel() { return user; }}

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

经由三种传参的比拟,在实际运用中我们一样平常利用ModelDriven吸收参数,为什么呢?由于低耦合高内聚啊。