Struts框架分析
动作方法
动作类:Demo3Action
import com.opensymphony.xwork2.ActionSupport;
/**
* 第三种方式: 创建一个类,继承ActionSupport 我们在开发中采取这种方式来创建我们的动作类
*
* @author xinbai 2020年4月8日,上午10:56:26
*/
public class Demo3Action extends ActionSupport {
// 当我们在类中什么都不写,一个动作方法都不提供时,有一个默认的动作方法:execute()
public String addUser() {
System.out.println("添加用户");
return SUCCESS;
}
public String updateUser() {
System.out.println("更新用户");
return SUCCESS;
}
public String deleteUser() {
System.out.println("删除用户");
return SUCCESS;
}
public String findUser() {
System.out.println("查找用户");
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>
<!-- 设置开发模式 ,struts.devMode特点改了配置文件,不需要重启,输出更多的错误,建议开发文件的常量值为true
修改struts中的properties定义的常量值-->
<constant name="struts.devMode" value="true"/>
<package name="p1" extends="struts-default">
<action name="addUser" class="test.Demo3Action" method="addUser">
<result name="success">/addUser.jsp</result>
</action>
<action name="updateUser" class="test.Demo3Action" method="updateUser">
<result name="success">/updateUser.jsp</result>
</action>
<action name="deleteUser" class="test.Demo3Action" method="deleteUser">
<result name="success">/deleteUser.jsp</result>
</action>
<action name="findUser" class="test.Demo3Action" method="findUser">
<result name="success">/findUser.jsp</result>
</action>
</package>
</struts>
在index.jsp中写:
<%-- 在Struts2中,控制器会默认拦截扩展名为.action的请求(以.action为后缀的url),除此之外,什么都不写也可以 --%>
<a href="${pageContext.request.contextPath}/addUser.action">添加学生信息</a>
<a href="${pageContext.request.contextPath}/updateUser.action">更新学生信息</a>
<a href="${pageContext.request.contextPath}/deleteUser.action">删除学生信息</a>
<a href="${pageContext.request.contextPath}/findUser.action">查找学生信息</a>
或者使用通配符,配置动作方法
struts.xml:
<!--使用通配符,配置动作方法
* 表示的是动作的名称,当有和动作名称像匹配的时候可以用(出现的位置,不是索引的话,是从1开始的,是索引就是从0开始)来代替 -->
<action name="*_*" class="test.Demo3Action" method="{1}{2}">
<result name="success">/{1}{2}.jsp</result>
</action>
index.xml:
<a href="${pageContext.request.contextPath}/add_User.action">添加学生信息</a>
<a href="${pageContext.request.contextPath}/update_User.action">更新学生信息</a>
<a href="${pageContext.request.contextPath}/delete_User.action">删除学生信息</a>
<a href="${pageContext.request.contextPath}/find_User.action">查找学生信息</a>
【说明】:如果遇到报错,首先检查下代码是否是自己失误打错了什么,仔细检查,我之前就报错了,网上找了半天,最后发现一个删除方法deleteUser的User没写,总是出问题,还是要仔细看代码。
动态方法调用
struts.xml:
<!-- 开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="p1" extends="struts-default">
<action name="user" class="test.Demo3Action" >
<result name="success">/showhelloworld.jsp</result>
</action>
</package>
index.jsp:
<%-- 动态方法调用
动作名称!动作方法名称.action
动作名称!动作方法名称--%>
<a href="${pageContext.request.contextPath}/user!addUser.action">添加学生信息</a>
<a href="${pageContext.request.contextPath}/user!updateUser.action">更新学生信息</a>
<a href="${pageContext.request.contextPath}/user!deleteUser.action">删除学生信息</a>
<a href="${pageContext.request.contextPath}/user!findUser.action">查找学生信息</a>
结果视图
struts.xml中
result元素:配置逻辑结构视图
name属性:结构视图名称,与动作方法返回值对应,当一致时前往指定的jsp
type属性:结果视图类型,不写的时候有默认值,默认值是dispatcher转发
常用取值:
dispatcher:请求转发,默认值
redirect:重定向
chain:转发到另一个动作
转发到同包(同名称空间)下的另一个动作
转发到不同包(不同名称空间)下的另一个动作
redirectAction:重定向到另一个动作
重定向到同包(同名称空间)下的另一个动作
重定向到不同包(不同名称空间)下的另一个动作
请求转发和请求重定向的区别
1、请求转发是一次请求一次响应,而重定向是两次请求两次响应
2、请求转发地址栏不会变化的,而重定向地址栏发生变化。
3、请求转发路径不带工程名,重定向需要带工程名路径。
4、请求转发只能在本网站内部,重定向可以定向到任何网站。
注意:如果需要使用request进行值传递,需要通过请求转发完成,如果页面需要跳转到其它网站上必须使用重定向。
用户注册界面
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>
<!-- 设置开发模式 ,struts.devMode特点改了配置文件,不需要重启,输出更多的错误,建议开发文件的常量值为true
修改struts中的properties定义的常量值-->
<constant name="struts.devMode" value="true"/>
<package name="p2" extends="struts-default" >
<!-- 自定义结果类型 -->
<result-types>
<result-type name="captcha" class="test.Demo4Action"> </result-type>
</result-types>
<action name="catchaAction" >
<result name="success" type="captcha"></result>
</action></package>
</struts>
test.Demo4Action.java
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import com.opensymphony.xwork2.ActionInvocation;
import cn.dsna.util.images.ValidateCode;
/**
* 自定义结果类型
* 第一步:
* 编写一个普通类,继承自StrutsResultSupport的类,并且重写doExcecute方法
* @author xinbai
* 2020年4月12日,下午3:29:39
*/
public class Demo4Action extends StrutsResultSupport {
//Servlet中原来怎么写,现在还怎么写
@Override
protected void doExecute(String finalLocation, ActionInvocation invocation)
throws Exception {
// TODO 自动生成的方法存根
ValidateCode code =new ValidateCode(200,40,4,10);
HttpServletResponse response=ServletActionContext.getResponse();
code.write(response.getOutputStream());
}
}
login.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>
<form action="" method="post" >
用户名:<input type="text" name="username"/><br/>
密码: <input type="password" name="password"/><br/>
验证码:<input type="text" name="valicateCode"/>
<img src="${pageContext.request.contextPath}/catchaAction.action"/>
<br/>
<input type="submit" value="注册">
<input type="submit" value="登录"></form>
</body>
</html>
所需的验证码jar包:
链接:https://pan.baidu.com/s/1Z9qZixRdI5nppuoH-Ji4vw
提取码:y57k
结果视图:
获取ServletAPI
获取ServletAPI 第一种方式 使用的是ServletActionContext的对象 (推荐)
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 获取ServletAPI 第一种方式 使用的是ServletActionContext的对象 (推荐)
*
*
* @author xinbai 2020年4月12日,下午7:05:43
*/
public class Demo5Action extends ActionSupport {
public String execute() {
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
ServletContext application=ServletActionContext.getServletContext();
HttpSession session=request.getSession();
System.out.println(request);
System.out.println(response);
System.out.println(application);
System.out.println(session);
return null;
}
}
struts.xml:
<package name="p3" extends="struts-default" >
<action name="action5" class="test.Demo5Action">
<result name="success"></result>
</action></package>
获取ServletAPI 第二种方式 ,使用的是依赖注入的形式,把我们想要的对象注入进来
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
/**
* 获取ServletAPI 第一种方式 使用的是ServletActionContext的对象 (推荐)
* 第二种方式
* 使用的是依赖注入的形式,把我们想要的对象注入进来
*
* @author xinbai 2020年4月12日,下午7:05:43
*/
public class Demo5Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
private ServletContext application;
private HttpServletResponse response;
private HttpServletRequest request;
public String execute() {
//HttpServletRequest request=ServletActionContext.getRequest();
//HttpServletResponse response=ServletActionContext.getResponse();
//ServletContext application=ServletActionContext.getServletContext();
HttpSession session=request.getSession();
System.out.println(request);
System.out.println(response);
System.out.println(application);
System.out.println(session);
return null;
}
@Override
public void setServletContext(ServletContext application) {
// TODO 自动生成的方法存根
this.application=application;
}
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO 自动生成的方法存根
this.response=response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO 自动生成的方法存根
this.request=request;
}
}