java web从零单排第六期《struts2》

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按钮完成创建:

java web从零单排第六期《struts2》_第1张图片

2.添加struts2框架支持,首先要下载struts的jar包,将如图所示的jar文件复制到lib目录中:

java web从零单排第六期《struts2》_第2张图片

java web从零单排第六期《struts2》_第3张图片

这几个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文件:

java web从零单排第六期《struts2》_第4张图片
标记action是本例的主要部分,属性值name是访问action的URL,就像servlet的mapping一样,是映射地址,通过这个名称就可以访问到action。属性class是这个action在项目中的具体路径,要带上包名和类名。子标记result是执行完action到达的jsp页面。

7.部署项目

运行程序:

java web从零单排第六期《struts2》_第5张图片

输入登录数据:

 

java web从零单排第六期《struts2》_第6张图片

点击提交按钮:


java web从零单排第六期《struts2》_第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()来看看控制台是否会有反应:

java web从零单排第六期《struts2》_第8张图片

运行,填写用户名和密码,提交之后控制台如下;

java web从零单排第六期《struts2》_第9张图片

这就证明了set方法的自动调用。

然后执行execute()方法,之后返回一个字符串,这个字符串就是struts.xml配置文件的result name,通过这个逻辑名称就可以找到真实的物理jsp页面了。

StrutsPrepareAndExecuteFilter起到了中心控制类的作用,与servletAPI进行解耦。

细心的同学可以和servlet的的代码进行对比,看看是不是简单了许多?恩,这就是struts2框架带给我们的方便,今天只是入门,今后的学习会更加有趣!

 

你可能感兴趣的:(java,Web,struts2)