Struts2学习笔记

Struts2学习

第一章 认识Struts2

第一节:Struts2简介

官网:http://struts.apache.org/

Struts2 是目前较为普及和成熟的基于MVC设计模式的web应用程序框架。

优点:

  • POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分。在Struts2框架下,你可以用任何一POJO来接收表单输入,同样的,你可以把任一POJO视为一个Action类。
  • 标签支持 - Struts2 改进了标签表单,而新的标签可让开发人员减少代码编写量。
  • AJAX支持 - Struts2 被认可接收进Web 2.0技术,并创建了功能非常类似于标准的Struts2 标签的AJAX标签,把AJAX支持整合进其结果中。
  • 易于整合 - Struts有多种整合方式可使用,现在与其他类型的框架,如Spring、Tiles、SiteMesh之类的,整合更为容易了。
  • 模板支持 - 支持使用模板生成视图。
  • 插件支持 - 有大量的插件可用于Struts2,而使用插件可以增强和扩大Struts2 核心行为。
  • 性能分析 - Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
  • 易于修改标签 - 在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了。
  • 促进减少配置 - Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置。
  • 视图技术 - Struts2 为多种视图选项(JSP、Freemarker、Velocity、XSLT等)提供支持。

以上是使Struts2 成为准企业框架的十大优点。

缺点:

  • 更大的学习曲线 - 使用Struts MVC,你必须要熟悉JSP、Servlet APIs标准以及一个大型、复杂的框架。
  • 文档缺乏 - 相比于Servlet和JSP APIs标准,Struts的在线资源较少,许多初学者会发现Apache在线文档混乱并缺乏整理。
  • 不够透明 - 相比于使用正常的基于Java的Web应用程序,使用Struts的应用程序有许多是进行在后台,这使得框架不易于理解。

最后说明一点,一个好的框架应该提供各种类型的应用程序都可以使用的通用行为,Struts2 是最好的Web框架之一,并频繁用于RIA(Rich Internet Applications)的发展。

第二节:Struts2 HelloWorld

创建Web项目HeadFirstStruts2Chap01

添加依赖jar包

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HeadFirstStruts2Chap01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 拦截用户的请求交给Struts2处理 -->
  
  <filter>
  	<filter-name>Struts2</filter-name>
  	<filter-class> <!-- Struts2核心处理器 负责分发请求 -->
  		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>

创建HelloWorldAction.java:

package com.ordinov.action;

import com.opensymphony.xwork2.Action;

public class HelloWorldAction implements Action {

	@Override
	public String execute() throws Exception {
		System.out.println("执行了Action的默认方法");
		return SUCCESS;
	}
	
}

配置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/dtds/struts-2.0.dtd">

<struts>
	
   <package name="helloWorld" extends="struts-default" >
     <action name="hello" class="com.ordinov.action.HelloWorldAction">
     	<result name="success">helloWorld.jsp</result>
     </action>
   </package>

</struts>

创建helloWorld.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Struts2 大爷你好!
</body>
</html>

项目结构如下:

启动Tomcat-->

访问http://localhost:8080/HeadFirstStruts2Chap01/hello -->

第三节:Struts2原理介绍

从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的:

  • 操作(Actions)
  • 拦截器(Interceptors)
  • 值栈(Value Stack)/OGNL
  • 结果(Result)/结果类型
  • 视图技术

而Struts2 与传统的MVC框架略有不同,因为它由Action扮演模型的角色,而不是控制器,虽然这样会有一些重叠。

上图描述了Struts2 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。

除了上述部分,还有许多组件相关的信息。web应用程序组件、Actions组件、拦截器组件、结果组件等等。

请求生命周期

通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:

  • 用户发送一个资源需求的请求到服务器(例如:页面)。
  • 核心控制器查看请求后确定适当的动作。
  • 使用验证、文件上传等配置拦截器功能。
  • 执行选择的动作来完成请求的操作。
  • 另外,如果需要的话,配置的拦截器可做任何后期处理。
  • 最后,由视图显示结果并返回给用户。

第二章 Struts2核心知识

第一节:Struts2 get/set自动获取/设置数据

复制HeadFirstStruts2Chap01并命名为HeadFirstStruts2Chap02

右键单击项目-->properties-->web Project Settings

将名称改为HeadFirstStruts2Chap02

更改HelloWorldAction.java增加name属性并添加get/set方法:

package com.ordinov.action;

import com.opensymphony.xwork2.Action;

public class HelloWorldAction implements Action {
	
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("执行了Action的默认方法");
		return SUCCESS;
	}
}

修改helloWorld.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${name}大爷你好!
</body>
</html>

部署并运行Tomcat-->访问http://localhost:8080/HeadFirstStruts2Chap02/hello?name=Struts2

结果:

第二节:ActionSupport类引入

Strust2必须要有Actions,创建Action时,除了实现Action之外,还可以继承ActionSupport,该类实现了6个接口,其中包括了Action。

Action的接口如下:

public interface Action {
   public static final String SUCCESS = "success";
   public static final String NONE = "none";
   public static final String ERROR = "error";
   public static final String INPUT = "input";
   public static final String LOGIN = "login";
   public String execute() throws Exception;
}

现在来对之前的HelloWorldAction来进行改造。

在HeadFirstStruts2Chap02的基础上,复制HelloWorldAction.java并命名为HelloWorldAction2.java

HelloWorldAction2.java:

package com.ordinov.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction2 extends ActionSupport  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String execute() throws Exception {
		System.out.println("执行了HelloWorldAction2 Action的默认方法");
		return SUCCESS;
	}
}

配置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/dtds/struts-2.0.dtd">

<struts>
	
   <package name="helloWorld" extends="struts-default" >
       
     <action name="hello" class="com.ordinov.action.HelloWorldAction2">
     	<result name="success">helloWorld.jsp</result>
     </action>
       
   </package>

</struts>

运行tomcat并查看结果,与之前效果一致。

第三节:Action 设置数据

第一种方式:属性驱动(Field Driven) A、基本数据类型属性 B、JavaBean类型属性

第二种方式:模型驱动(Model Driven)

创建User.java:

package com.ordinov.model;

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;
	}
	
}

创建UserService.java:

package com.ordinov.service;

import com.ordinov.model.User;

public class UserService {

	public boolean login(User user) {
		if("ordinov".equals(user.getUserName()) && "123456".equals(user.getPassword())) {
			return true;
		} else {
			return false;
		}
	}
}

属性驱动

创建UserAction.java:

package com.ordinov.action;

import com.opensymphony.xwork2.ActionSupport;
import com.ordinov.model.User;
import com.ordinov.service.UserService;

public class UserAction extends ActionSupport  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private UserService userService = new UserService();
	
	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;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("执行了UserAction的默认方法");
		User user =  new User();
		user.setUserName(userName);
		user.setPassword(password);
		if(userService.login(user)) {
			return SUCCESS;
		} else {
			return ERROR;
		}
	}
	
}

创建login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="user" method="post">
	用户名:<input type="text" name="userName" />
	密码:<input type="text" name="password" />
	<input type="submit" value="登录" /> 
</form>
</body>
</html>

创建success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功!
</body>
</html>

创建error.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登录失败!
</body>
</html>

配置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/dtds/struts-2.0.dtd">

<struts>
	
   <package name="helloWorld" extends="struts-default" >
     <action name="hello" class="com.ordinov.action.HelloWorldAction2">
     	<result name="success">helloWorld.jsp</result>
     </action>
     
     <action name="user" class="com.ordinov.action.UserAction">
     	<result name="success">success.jsp</result>
     	<result name="error">error.jsp</result>
     </action>
     
   </package>

</struts>

部署并运行tomcat访问:http://localhost:8080/HeadFirstStruts2Chap02/login.jsp

创建UserAction2.java:

package com.ordinov.action;

import com.opensymphony.xwork2.ActionSupport;
import com.ordinov.model.User;
import com.ordinov.service.UserService;

public class UserAction2 extends ActionSupport  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private UserService userService = new UserService();
	
	private User user;
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("执行了UserAction2的默认方法");
		if(userService.login(user)) {
			return SUCCESS;
		} else {
			return ERROR;
		}
	}
	
}

配置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/dtds/struts-2.0.dtd">

<struts>
	
   <package name="helloWorld" extends="struts-default" >
     <action name="hello" class="com.ordinov.action.HelloWorldAction2">
     	<result name="success">helloWorld.jsp</result>
     </action>
     
     <action name="user" class="com.ordinov.action.UserAction">
     	<result name="success">success.jsp</result>
     	<result name="error">error.jsp</result>
     </action>
     
     <action name="user2" class="com.ordinov.action.UserAction2">
     	<result name="success">success.jsp</result>
     	<result name="error">error.jsp</result>
     </action>
     
   </package>

</struts>

模型驱动

创建UserAction3.java:

package com.ordinov.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.ordinov.model.User;
import com.ordinov.service.UserService;

public class UserAction3 extends ActionSupport implements ModelDriven<User> {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private UserService userService = new UserService();
	
	private User user = new User();

	@Override
	public String execute() throws Exception {
		System.out.println("执行了UserAction3的默认方法");
		if(userService.login(user)) {
			return SUCCESS;
		} else {
			return ERROR;
		}
	}

	@Override
	public User getModel() {
		return user;
	}
	
}

配置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/dtds/struts-2.0.dtd">

<struts>
	
   <package name="helloWorld" extends="struts-default" >
     <action name="hello" class="com.ordinov.action.HelloWorldAction2">
     	<result name="success">helloWorld.jsp</result>
     </action>
     
     <action name="user" class="com.ordinov.action.UserAction">
     	<result name="success">success.jsp</result>
     	<result name="error">error.jsp</result>
     </action>
     
     <action name="user2" class="com.ordinov.action.UserAction2">
     	<result name="success">success.jsp</result>
     	<result name="error">error.jsp</result>
     </action>
     
     <action name="user3" class="com.ordinov.action.UserAction3">
     	<result name="success">success.jsp</result>
     	<result name="error">error.jsp</result>
     </action>
     
   </package>

</struts>

第四节:Struts2处理传入多个值

第五节:struts.xml配置

第六节:动态方法调用

第七节:Action生命周期

第八节:result配置

第三章 Struts2拦截器

第四章 值栈与OGNL

第五章 Struts2标签

第六章 Struts2国际化

第七章 Struts2验证框架

第八章 Struts2文件上传和下载

第九章 Struts2防重复提交

原文地址:https://www.cnblogs.com/guoyx/p/12507009.html