struts2概述:
1.给予MVC模式的java EE 技术WEB开发框架。可以对使用javaEE技术的web项目开发进行代码的分层,优点是利于维护。
2.struts2来源于webwork框架,是在webwork框架基础上再与struts1的优点进行整合而设计出的新的MVC分层框架。
3.struts2的优点主要体现在解耦上,其他的附属技术也比struts1有所加强,使用上更加快捷方便,如取消了struts1中的ActionForm及简化了配置文件的代码。
4.在网站http://struts.apache.org/可以找到其全部相关资料,包括源代码,开发帮助文档,javaAPI的使用帮助等。
5.如果以前没有使用过struts1框架,请查阅与MVC模式相关的资料,这样有易于以后的学习,至少需要知道MVC模式中的作用。
本次从零单排系列中,相关理论性的知识会很少,主要以代码为主。
下面把上一节的servlet用struts2框架来完成。
1.在eclipse中新建一个web项目struts,单击finish按钮完成创建:
2.添加struts2框架支持,首先要下载struts的jar包,将如图所示的jar文件复制到lib目录中:
这几个jar文件可以在http://struts.apache.org下载,官网提供集成版下载,包括jar及源代码和帮助文档。
3.新建三个jsp页面,分别是登陆页面,成功页面,失败页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <form action="login.action" method="post" name="login"> <p> 用户: <input type="text" name="username" id="textfield1"><br> <br> 密码: <input type="password" name="password" id="password1"> <br> <br> <input type="submit" name="button" value="提交"> </p> </form> </body> </html>
form标签中的action属性值为login.action,因为struts2的访问后缀是action,而login则是他的请求路径。
新建登陆成功页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE body PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> success! </body> </html>
新建登陆失败页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE body PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> wrong! </body> </html>
4.新建业务控制组件
struts2的业务组件非常简洁美观。新建一个package包命名为controller,然后在改包新建一个Login类,其功能是MVC中的控制层。
package controller; public class Login { private String username; 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; } private String password; public String execute() { if(username.equals("hello")&&password.equals("struts2")) { return "success"; } else { return "false"; } } }
上述代码新建了两个属性username和password,在Myeclipse中生成这两个属性的set和get方法:
source->Generate setters and getters->select all->finish则会自动生成。
还要加入一个execute方法,但这个方法的声明是有严格规定的,必须是以一个public开头,该方法的返回类型是String类型,方法名称是execute(),该约定就像是public static void main(String args[])一样固定。
execute()方法返回值是一个指向物理文件地址的逻辑名称,在配置文件中进行配置,相当于struts1中的ActionForward类。
在execute中队username和password的只进行判断,这里需要的注意的是,class Login类的两个属性username和password实际上是jsp页面中的表单名称(name)相对应。
至此已经创建完了jsp页面和控制层文件,而且已经在控制层类Login中实现了一个简易的验证登陆功能,下一步就是通过配置文件将jsp页面与Login类和其它组件关联起来。
5.在xml文件中加入过滤器:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
添加过滤器的目的是拦截所有请求。
6.新建中心配置文件
在src中创建struts.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtd/struts-2.0.dtd"> <struts> <package name="Maybe" extends="struts-default"> <action name="login" class="controller.Login"> <result name="success">/true.jsp</result> <result name="false">/false.jsp</result> </action> </package> </struts>
标记package和Java中的package相类似,随便起一个名字都可以。extends属性的功能是对原有struts2的功能进行继承,使得注册的action自带一些功能,所以在系统中包含一个自带的struts-default.xml文件:
标记action是本例的主要部分,属性值name是访问action的URL,就像servlet的mapping一样,是映射地址,通过这个名称就可以访问到action。属性class是这个action在项目中的具体路径,要带上包名和类名。子标记result是执行完action到达的jsp页面。
7.部署项目
运行程序:
输入登录数据:
8.总结:
回顾一下执行流程:
(1)进入login.jsp页面
(2)输入明户名hello 密码struts2
(3)注册文件webxml中的org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter进行URL的捕捉,将访问路径在struts.xml中进行查找,找到一个名为login.action的路径。此时对username和password的值进行自动填充,为了更加清晰的看到自动填充,我们在username和password的set方法中添加system.out.print()来看看控制台是否会有反应:
运行,填写用户名和密码,提交之后控制台如下;
这就证明了set方法的自动调用。
然后执行execute()方法,之后返回一个字符串,这个字符串就是struts.xml配置文件的result name,通过这个逻辑名称就可以找到真实的物理jsp页面了。
StrutsPrepareAndExecuteFilter起到了中心控制类的作用,与servletAPI进行解耦。
细心的同学可以和servlet的的代码进行对比,看看是不是简单了许多?恩,这就是struts2框架带给我们的方便,今天只是入门,今后的学习会更加有趣!