Struts2学习
1.Model2模型:
在java web开发中,基于Servlet+JSP+JavaBean的开发模型称为Model2模型,该模型完全遵守MVC模式:
JavaBean:模型层,既可以封装数据,又可作为业务逻辑模型。接收到控制器传递的更新请求后,执行逻辑处理返回响应的执行结果。
JSP:表现层,负责提供用户数据显示页面,并在适当时候(提交表单)向控制器请求模型更新。
Servlet:控制器。接收用户请求,然后获取数据并转换为业务模型需要的模型,然后调用模型的业务方法,请求模型更新;同时根据执行结果选择返回的视图页面。
基本流程:
1 用户发出一个request请求,会被控制器servlet接收到。
2 servlet将请求的数据转换成数据模型javabean,然后调用模型的逻辑方法。
3 servlet把业务逻辑模型返回的结果放到合适的地方,譬如request的属性里。
4 根据逻辑模型返回结果,servlet选择合适的jsp视图。
5 jsp视图展示数据给用户。
缺点:
1 流程凌乱:servlet既要处理请求,还要处理页面流程,功能不单一,无法把握整个系统的页面流程。
2 数据传递无序:使用javabean传递数据比较繁琐,有时候无法满足需求。
3 缺乏辅助功能:没有统一的分发调度 验证框架 国际化 异常处理等等功能。
2.Struts2
Struts2:基于mvc轻量级web框架
Struts2:控制器(StrutsPrepareAndExecuteFilter),视图(Result),模型(Action)
控制器:
该过滤器负责根据用户提交的URL和struts.xml中的配置,来选择合适的动作(Action),让这个Action来处理用户的请求。该控制器其实是一个过滤器,是Struts2内置类,只是要在项目的web.xml中配置一下即可。
动作–Action模型:
负责把用户请求中的参数组装成合适的数据模型,并调用相应的业务逻辑进行真正的功能处理,获取下一个视图所需要的数据。实现了与Servlet API的解耦
视图–Result:
视图结果用来把动作中获取到的数据展现给用户。
2.1 Struts2配置:
步骤:
1 从官网下载struts-2.5.10.1-all.zip
2 创建web项目,拷贝必须jar文件,放置在WEB-INF下的lib目录中。(可以从官网下载struts-2.5.10.1-min-lib.zip)
在web.xml中添加核心控制器配置:
<!-- Struts2核心控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4 创建对应jsp文件
5 创建对应的Action模型类
6 在项目的src目录下创建struts.xml文件
参考下载的Struts文件目录的.\app\struts2-showcase.war\WEB-INF\classes\struts.xml。
<struts>
<package name="my" extends="struts-default">
<!-- 没有method属性,则默认调用Action的execute方法 -->
<action name="loginAction" class="org.westos.action.UserAction">
<result name="suc">/suc.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
<!-- 未使用默认方法,设置method属性 -->
<action name="registerAction" class="org.westos.action.UserAction" method="register">
<result name="regSuc">/regSuc.jsp</result>
</action>
<action name="login2Action" class="org.westos.action.OtherAction">
<result>/suc2.jsp</result>
<result name="error">/fail.jsp</result>
</action>
<action name="login3Action" class="org.westos.action.AnotherAction">
<result>/suc3.jsp</result>
<result name="error">/fail.jsp</result>
</action>
</package>
</struts>
2.2 Struts2执行流程:
- Action:
代表一次请求或调用,对应于一个Action类。
在Struts2里面充当着MVC中模型的角色,既封装了业务数据,又要处理业务功能。但在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,Action只是去调用逻辑层来进行业务逻辑的处理。
Action中方法实现的功能,是MVC中控制器部分的功能。
因为过滤器作为核心控制器,Action常看做model层。 - Action的实现方式:
在Struts2中,Action可以不实现任何特殊的接口或者继承特殊的类,仅仅是一个POJO(Plain Old Java Object,简单的Java对象)就可以,但要有一个公共的无参的构造方法,还可以有一个返回String类型的execute或其他方法
如果struts.xml配置文件中Action没有method属性,则execute方法是必须的。
但实际开发的时候,Action实现方式。
1.实现Action接口中,仅仅定义了前面的execute方法,除外还有一系列预定义的字符串常量,可以用于返回一些预定的result。
2.继承ActionSupport类 ,除实现了Action接口,还提供更多辅助功能。推荐使用 - Action获取页面数据:
在Struts2中,页面的数据传递给Action有两种基本方式:属性驱动(FieldDriven)和模型驱动(ModelDriven)。
属性驱动又有两种情况:
1 基本数据类型的属性对应:控件的name属性,和Action的属性对应。
2 JavaBean风格的域对象对应: 控件的name属性是域对象.属性名方式。推荐方式
3.动态Web项目代码
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>Struts2Study2</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>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
struts.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="my" extends="struts-default">
<interceptors>
<interceptor name="loginInterceptor" class="org.westos.action.LoginInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 默认拦截器声明,对package范围Action均生效 -->
<default-interceptor-ref name="myStack" />
<!-- package级别的Result,对所有Action均生效 -->
<global-results>
<result name="login">/index.html</result>
</global-results>
<!-- 没有method属性,则默认调用Action的execute方法 -->
<action name="loginAction" class="org.westos.action.UserAction">
<result>/suc.jsp</result>
<result name="error">/fail.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<action name="anotherAction" class="org.westos.action.AnotherAction">
<result>/suc2.jsp</result>
</action>
</package>
</struts>
Action类:
package org.westos.action;
import java.io.Serializable;
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 4613077549622196817L;
private String name;
private String pwd;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
package org.westos.action;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = -6266423214755049789L;
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String execute() throws Exception {
if("ts".equals(name)) {
User u = new User();
u.setName(name);
u.setPwd(pwd);
//和Servlet进行交互
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("us", u);
return SUCCESS;
}
return ERROR;
}
}
package org.westos.action;
import java.util.ArrayList;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class AnotherAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 5511163633883650547L;
@Override
public String execute() throws Exception {
ArrayList<User> list = new ArrayList<>();
for (int i = 0; i <=10; i++) {
User u = new User();
u.setName("user"+i);
u.setPwd("pwd"+i);
list.add(u);
}
ServletActionContext.getRequest().setAttribute("us", list);
return SUCCESS;
}
}
package org.westos.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginInterceptor implements Interceptor {
/**
*
*/
private static final long serialVersionUID = 4378531652823521065L;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//Struts2对HttpSession封装为Map格式
Map<String,Object> map = invocation.getInvocationContext().getSession();
//是否保存us键值对
if(map.get("us")==null) {
return "login";
}
else {
return invocation.invoke();
}
}
}
前台页面:
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="loginAction">
用户名:<input type="text" name="name" placeholder="请输入用户名"><br>
密码:<input type="password" name="pwd" placeholder="请输入密码"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
suc.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功页面</title>
</head>
<body>
<!-- el -->
1 欢迎你${name}<br/>
<!-- struts2标签获取ValueStack中属性的值 -->
2 <s:property value="name"/><br/>
<!-- struts标签获取ActionContext根对象中session对应的值 -->
3 <s:property value="#session.us.pwd"/><br/>
<!-- el表达式 -->
4 ${sessionScope.us.pass}
</body>
</html>
suc2.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:iterator value="#request.us" var="u">
<s:property value="#u.name"/>
<s:property value="#u.pwd"/>
</s:iterator>
</body>
</html>
fail.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>失败页面</title>
</head>
<body>
登陆失败...
</body>
</html>
上一篇: Java学习笔记:Struts2初学
下一篇: Struts2学习