java之SSH框架的Struts2框架的分析续

动作方法

动作类: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;
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44830627/article/details/105425110
今日推荐