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
HeadFirstStruts2Chap01
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
Struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
Struts2
/*
创建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:
helloWorld.jsp
创建helloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
Struts2 大爷你好!
项目结构如下:
启动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"%>
Insert title here
${name}大爷你好!
部署并运行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:
helloWorld.jsp
运行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"%>
Insert title here
创建success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
登录成功!
创建error.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
登录失败!
配置struts.xml:
helloWorld.jsp
success.jsp
error.jsp
部署并运行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:
helloWorld.jsp
success.jsp
error.jsp
success.jsp
error.jsp
模型驱动
创建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 {
/**
*
*/
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:
helloWorld.jsp
success.jsp
error.jsp
success.jsp
error.jsp
success.jsp
error.jsp