1.目录结构及导入的jar包

2.web.xml 配置

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <filter>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

2.Action类编写

User JavaBean定义

 package cn.test.entity;

 public class User {

     private String name;
private String age;
private String password; public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "User [age=" + age + ", name=" + name + ", password=" + password
+ "]";
} }

通过继承ActionSupport类创建 Action控制器:

(1)不管是通过Javabean 还是直接通过属性字段获取请求数据,都需要在Action类设置setter getter方法

(2)ActionSupport类实现了Action接口,所以此处可以选择重写execute() 方法,处理请求

(3)此处通过ActionContext类访问Servlet API,获取session对象

 package cn.test.action;

 import cn.test.entity.User;

 import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; /**
* Action处理请求参数-属性驱动 strtus2中页面的请求数据和Action有两种基本的对应方式,分别是字段驱动和模型驱动方式。字段驱动也叫属性驱动
* 属性驱动是指通字段进行数据传递,包括:与基本数据类型的属性对应,直接使用域对象(也就是javaBean)
*
* @author Administrator
*
*/
public class UserLoginAction extends ActionSupport { private static final long serialVersionUID = 1L;
private User user;// 通过javaBean获取前端传递的数据;必须设置getter setter方法 public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} @Override
public String execute() throws Exception { //继承ActionSupport接口的Action类中,必须要有重写的execute方法
//获取Context对象: 通过ActionContext类访问Servlet API
ActionContext context = ActionContext.getContext();
if("admin".equals(user.getName()) && "123".equals(user.getPassword())){
//把用户名和密码放到session中
context.getSession().put("username", user.getName());
context.getSession().put("password", user.getPassword());
return Action.SUCCESS;
} else {
context.getSession().put("error", "用户登陆失败");
return ERROR;//Action接口中定义的常量
} } }

3. struts.xml中 action的配置

当Action类返回“success”逻辑视图名,请求转发到loginSuccess.jsp 页面,当返回error 逻辑视图名,请求转发到 loginError.jsp 页面。

红色部分是配置了一个默认的action,当请求一个不存在的action时,一般页面会报404 not found,当我们配置默认的action,如果请求一个不存在的aciton时,页面就会跳转到

我们指定的错误页面,而不是提示404, 此处跳转到error.jsp 页面

 <?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.enable.DynamicMethodInvocation" value="true"></constant>
<constant name="struts.devMode" value="true"></constant> <!-- 配置默认的action,当请求一个不存在的Action,将跳转到error.jsp页面-->
<package name="default" namespace="/user" extends="struts-default">
12 <default-action-ref name="defaultAction"></default-action-ref>
13 <action name="defaultAction">
14 <result>/error.jsp</result>
15 </action>
16 </package>
<package name="user" namespace="/user" extends="struts-default">
<action name="userLogin" class="cn.test.action.UserLoginAction">
<result name="success">/loginSuccess.jsp</result>
<result name="error">/loginError.jsp</result>
</action>
</package>
</struts>

4. JSP页面编写

登录页面userLogin.jsp(浏览器直接请求该页面,进入到登陆页面):

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

 <%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>userLogin page</title>
</head>
<body>
<div style="margin:10px;padding:10px">
<form name="fomr1" action="<%=basePath%>user/userLogin.action" method="post">
用户名:<input type="text" name="user.name" /><br/>
密码: <input type="password" name="user.password" /><br/>
<input type="submit" value="登陆" />
</form>
</div>
</body>
</html>

登陆成功页面

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'success.jsp' starting page</title>
</head> <body>
登陆成功,session中的登陆用户名是:<%=request.getAttribute("user.name") %><br>
<!--<s:property value="name"/> value里面写上Action类中定义的属性,就能在jsp页面显示请求中所带的参数了 -->
采用OGNL与Struts2标签输出Action类的属性值(Action类获取到的请求参数值) <br/>
name=<s:property value="user.name" />&nbsp;&nbsp; password=<s:property value="user.password" /> <br>
采用EL表达式 输出Action类的属性值(${对象名.属性名 }):<br>
name=${user.name }
</body>
</html>

登陆失败页面

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登陆失败页面</title>
</head> <body>
控制器返回的错误信息为:${error };<br>
<a href="userLogin.jsp">单击链接返回登陆页面</a>
</body>
</html>

默认Action指定的跳转页面

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'success.jsp' starting page</title>
</head>
<body>
真不巧,您访问的页面走丢了<br>
<a href="userLogin.jsp">单击链接返回登陆页面</a>
</body>
</html>

部署测试:

(1)输入一个访问不到的请求:http://localhost:8080/strutsstu3/user/userLogi ,此时处理请求的是默认Action

(2) 单击上一步的链接, 转到 http://localhost:8080/strutsstu3/userLogin.jsp

输入admin 和一个错误的密码,结果如下:

单击链接返回登陆页,输入admin 和123 提交,结果如下

注:

(1)在使用Javabean属性方式传值时,如果JSP页面时负责取值的,那么取值的格式必须为“对象.属性名”;如果JSP页面时负责传值的,那么传值的格式可以为“对象.属性名”,也可以直接是“属性名”

(2)Struts2的Action没有与ServletAPI发生耦合,但是web开发中经常会用到ServletAPI中的对象,如用户登陆成功,则应该将用户信息保存到HttpSession中,而最常用的ServletAPI就是HttpSession, HttpServletRequest、ServletContext这三个接口,Strtus2访问ServletAPI,可以分为2类:与Servlet API 解耦的访问方式和与servlet API耦合的访问方式。

与Servlet API 解耦的访问方式:

(a)使用ActionContext类获取Servlet 对象对用的Map对象

例如:

ActionContext context = ActionContext.getContext();

Map request = (Map) context.get("request");//ActionContext类没有提供getRequest()这样的方法来获取HttpServletRequest对应的map对象,要想得到HttpServletRequest对象对应的map对象,需要为get()方法传递request参数

context.put("username", "admin");    //放到request作用域,相当于ServletAPI中国年的HttpServletRequest的setAttribute()方法
context.getSession().put("username", "admin");  // 把信息放到session作用域
context.getApplication().put("username", "admin");  // 把信息放到Application 作用域

(b) 实现特定接口获取Servlet API对象

与Servlet API 耦合的访问方式:

示例代码下载地址   https://github.com/liuch0228/Struts2SSH.git

Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI的更多相关文章

  1. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  2. Python开发基础-Day18继承派生、组合、接口和抽象类

    类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...

  3. python基础之继承派生、组合、接口和抽象类

    类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...

  4. struts2基础篇(1)

    一.Struts2简介Struts2以WebWork优秀的设计思想为核心,吸收了Struts1的部分优点,建立了一个基于WebWork和Struts1的MVC框架. 二.搭建Struts2开发环境2. ...

  5. Struts2学习笔记(六)——Action处理请求参数

    在struts2框架中关于Action处理请求参数有两种方案(三个方式),表单属性的名称应该和在Action类中定义的成员属性或者在JavaBean中定义的成员属性名称一样: 1.属性驱动 1)直接在 ...

  6. struts2默认Action配置

    在项目中,需要在输入错误的url的时候,弹出友好的错误提示页面 在struts2中可以通过配置默认的action达到这个目的 配置方法: <package name="default& ...

  7. Flask基础(16)-->WTForms表单创建和简单验证

    Flask基础(16)-->WTForms表单创建和简单验证 前言:使用Flask_WTF需要配置参数SECRET_KEYCSRF_ENABLED是为了CSRF(跨站请求伪造)保护.SECRET ...

  8. 十一、Struts2封装请求参数的方式

    十一.Struts2封装请求参数的方式 方式一.Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器干的) 注意:表单中的名称要和动作类中的名称一致(这是必须 ...

  9. jmeter将上一个接口返回值作为下一个接口的请求参数

    在jmeter中有时候会用到,将上一个接口的返回值作为下一个接口的请求参数 具体操作如下: 1.首先新建一个http请求(右键线程组--添加Sampler--http请求),同时添加好接口相应的请求参 ...

随机推荐

  1. Gym 100917M Matrix, The

    题目链接: http://codeforces.com/gym/100917/problem/M --------------------------------------------------- ...

  2. 用notepad++ 打造轻量级Java编译器

    http://blog.163.com/jackie_howe/blog/static/19949134720125591752396/ 用notepad++ 打造轻量级Java编译器 2012-06 ...

  3. python简单的函数定义和用法实例

    python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...

  4. Fedora 的截屏功能

    写写博客少不了截图,Windows 上使用微信的快捷键 Ctrl+A 截图并且可以随意编辑是挺方便的,开始在 Linux 上还没有找到这样的软件,只找到了不支持编辑的简单截图软件. 1. 使用 Scr ...

  5. 16/7/8_PHP-书写规范 PHP Coding Standard

    变量命名规范这里感觉 打算采用 匈牙利命名法+驼峰法命名,因为 PHP是弱类型语言,很多时间因为忽略了变量类型而导致犯一些低级错误.所以在前面加上类型名有助于更好的理解代码. 下载是转载 PHP书写规 ...

  6. SqlServer 索引和视图

    Ø 索引 1. 什么是索引 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度. 2. 索引分类 数据库中索引主要分为两类:聚集索引和非聚集索引.SQL Serv ...

  7. [转]Scikit-learn使用总结

    1 scikit-learn基础介绍 1.1 估计器(Estimator) 估计器,很多时候可以直接理解成分类器,主要包含两个函数: fit():训练算法,设置内部参数.接收训练集和类别两个参数. p ...

  8. 【ABAP系列】SAP ABAP基础-录制BDC的MODE定义解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP基础-录制BDC ...

  9. 07 (H5*) js课程第8天 高阶函数、闭包、沙箱

    目录: 1:call和apply方法调用 2:bind方法复制 3:函数中的几个属性值 4:高阶函数,函数作为参数 5:高阶函数,函数作为返回值. 6:   作用域链,作用域,预解析 7:闭包--延长 ...

  10. Zookeeper---作为服务注册中心

    认识Zookeeper是一套分布式协调服务. 优点: 简单:与文件系统类似,Znode的组织方式. 多副本:一般再线上都是三副本或者五副本的形式,最少会有三个节点. 有序:有序的操作,根据时间戳进行排 ...