Struts2 配置文件result元素 作用:為動作指定結果視圖 name屬性:邏輯視圖的名稱,對應著動作方法的返回值。預設值是success type屬性:結果類型,指的就是用什麼方式轉到定義的頁面,預設是dispatcher result中type的取值有四種類型 | | | | | : | ...
Struts2-配置文件result元素
作用:為動作指定結果視圖
name屬性:邏輯視圖的名稱,對應著動作方法的返回值。預設值是success
type屬性:結果類型,指的就是用什麼方式轉到定義的頁面,預設是dispatcher
result中type的取值有四種類型
dispatcher | 預設值使用請求轉發,轉向一個頁面 |
redirect | 使用重定向,轉向一個頁面 |
chain | 轉發到另一個相同名稱空間的動作,轉發到不同名稱空間的動作 |
redirectAction | 重定向到另一個相同名稱空間的動作,重定向到不同名稱空間的動作 |
result元素 轉發與重定向
dispatcher:是轉發到一個頁面(jsp)
chain:是轉發到一個action
redirect:重定向一個頁面
redirectAction:重定向到另一個action
自定義結果類型
上面的重定向,轉發都是結果類型
結果類型就是一個類,這些類都是些com.opensymphony.xwork2.Result介面,或者繼承自介面的實現類org.apache.struts2.dispatcher.StrutsResultSupport
這些類都有一個doExecute方法,用於執行結果視圖,struts的內部實現就是Servlet
自定義驗證碼結果類型
package com.gyf.web.result;
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;
public class CAPTCHAResult extends StrutsResultSupport{
private int width;
private int height;
@Override
protected void doExecute(String arg0, ActionInvocation arg1) throws Exception {
//生成驗證碼
//創建一個驗證碼對象
ValidateCode code = new ValidateCode(width,height,4,6);
//獲取response對象,因為要返回給客戶端
HttpServletResponse response = ServletActionContext.getResponse();
code.write(response.getOutputStream());//write方法可以把圖片寫回給客戶端,但是需要一個輸出流
}
public int getHeight() {
return height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置開發模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="p1" extends="struts-default" namespace="/n1">
<!--聲明一個結果類型 -->
<result-types>
<result-type name="captcha" class="com.gyf.web.result.CAPTCHAResult"></result-type>
</result-types>
<!--配置action -->
<action name="checkcode">
<result type="captcha">
<param name="width">150</param>
<param name="height">60</param>
</result>
</action>
</package>
</struts>
result元素-全局視圖和局部視圖
Struts2-動作類中的servlet api 訪問講解
第一種方式
package com.gyf.web.action;
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;
public class TestAction extends ActionSupport{
public String test() {
//獲取servlet 的api方式
//第一種方式:通過ServletActionContext
//response
HttpServletResponse response = ServletActionContext.getResponse();
//request
HttpServletRequest request = ServletActionContext.getRequest();
//session
HttpSession session = request.getSession();
//application[ServletContext]
ServletContext application = ServletActionContext.getServletContext();
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(application);
//NONE相當於不用跳轉頁面,也就是相當於不用找result標簽,
return NONE;
}
}
第二種方式
package com.gyf.web.action;
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 org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction2 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
HttpServletResponse response;
HttpServletRequest request;
ServletContext application;
public String test() {
//第二種方式,通過實現介面,讓Struts自動註入
System.out.println(request);
System.out.println(response);
System.out.println(application);
//NONE相當於不用跳轉頁面,也就是相當於不用找result標簽,
return NONE;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
@Override
public void setServletContext(ServletContext application) {
this.application=application;
}
}
Action接收請求參數
通過Servlet和Action的屬性set方法註入獲取參數
package com.gyf.web.action;
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;
public class LoginAction extends ActionSupport{
//第二種方式通過屬性的set註入
private String username;
private String password;
public String login() {
//第一種方式:通過ServletActionContext
//request
// HttpServletRequest request = ServletActionContext.getRequest();
// String username = request.getParameter("username");
// String password = request.getParameter("password");
System.out.println(username);
System.out.println(password);
//NONE相當於不用跳轉頁面,也就是相當於不用找result標簽,
return NONE;
}
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;
}
}
第三種方式通過Action的屬性的set模型的形式註入
第四種方式通過模型驅動在action里實現一個模型驅動介面
實現步驟:
在action里實現一個模型驅動介面
提供一個模型屬性,並一定要賦值
實現原理:是因為有個模型驅動的攔截器在處理,ModelDrivenIngetrceptor,處理過程中給User賦予值
package com.gyf.web.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;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
<%@ 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>Insert title here</title>
</head>
<body>
<!-- 第四種方式 -->
<form action="${pageContext.request.contextPath}/login.action">
用戶名<input type="text" name="username"><br>
密碼<input type="password" name="password"><br>
<input type="submit" name="登錄">
</form>
<!-- 第三種方式 -->
<!--
<form action="${pageContext.request.contextPath}/login.action">
用戶名<input type="text" name="user.username"><br>
密碼<input type="password" name="user.password"><br>
<input type="submit" name="登錄">
</form>
-->
</body>
</html>
package com.gyf.web.action;
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.gyf.web.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User>{
public String login() {
System.out.println(user);
return NONE;
}
private User user = new User();
@Override
public User getModel() {
return user;
}
}