ideal创建Struts 2.x项目
一、 目录
二、 Struts 2原理
Struts 2与webwork的工作方式相似,使用拦截器作为处理用户请求的控制器。在Struts 2中有一个核心控制器FilterDispatcher,相当于Struts 1.x中的ActionServlet类,负责处理用户的请求,Struts 2的工作流程如下:
1. 客户端浏览器发送请求到服务端,以page.action页面的形式。
2. 核心控制器FilterDispatcher接收请求后,根据后面的扩展名,来决定是否调用Action,以及调用哪个Action。
3. 在调用Action的execute方法之前,Struts 2会调用一系列的拦截器以提供一些通用的功能,如workflow、验证或文件上传等功能。被称为拦截器链。
4. 之后就会调用execute方法,执行用户相关操作,如数据库操作,业务处理等。
5. 根据execute方法的返回值,会将处理结果返回到浏览器,可以是HTML页面、JSP页面、图像或其他web资源。
Struts 2原理图
Struts 2源码
Struts 2源码:https://github.com/apache/struts
三、 ideal创建过程
创建New Project
自动下载jar包
文件目录
添加外部jar包进入artifacts
debug在本地浏览器访问http://localhost:8080/index.jsp
下面用一个简单登陆(没有整合database)的demo简述struts 2的流程
四、 struts 2的工作流程Demo:
表现层:login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<s:form action="login">
<s:textfield label="用户" name="username"/>
<s:password label="密码" name="password"/>
<s:submit value="登录"/>
</s:form>
</body>
</html>
逻辑层:LoginAction.java
package main.action;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import java.util.Map;
public class LoginAction implements Action{
private String username;
private String password;
private static Map<String, String> users = new java.util.
HashMap<String, String>();
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;
}
static {
users.put("bill", "123");
users.put("wong", "123");
users.put("song", "123");
}
@Override
public String execute() throws Exception {
try{
// 获得ActionContext对象,可以通过该对象实例访问Servlet API
ActionContext ctx = ActionContext.getContext();
// 获得Map对象,可以通过用这个Map对象访问ServletContext对象
Map application = ctx.getApplication();
// 获得Map对象,可以用这个Map对象访问HttpSession对象
Map session = ctx.getSession();
// 从ServletContext对象中获得计数器变量,应用计数器
Integer counter = (Integer) application.get("counter");
// 将用户名保存进HttpSession对象中
session.put("username", getUsername());
String pw = users.get(username);
if (pw == null){
ctx.put("info", "该用户不存在,登录失败");
return ERROR;
} else {
if (pw.equals(getPassword())){
if (counter == null){
counter = 1;
} else {
counter++;
}
application.put("counter", counter);
ctx.put("info", "已成功登录");
return SUCCESS;
} else {
// 将处理结果保存在HttpServletRequest对象中
ctx.put("info", "该用户不存在,登录失败");
return ERROR;
}
}
}
catch (Exception e){
return ERROR;
}
}
最重要的就是在struts.xml中配置action
<action name="login" class="main.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<!--<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authorization"/>-->
</action>
显示结果的页面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆成功</title>
</head>
<body>
本站访问次数:${applicationScope.counter}<p/>
用户名:${sessionScope.username}<p/>
${requestScope.info}
</body>
</html>