一、分模块开发:单独写模块的配置文件,把配置文件引入到核心配置文件中

Aaction的单独配置文件如下

<?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> <package name="hellodemo" extends="struts-default" namespace="/">
<!-- name: 访问名称 -->
<action name="hello" class="cn.itcast.action.HelloAction">
<!-- 配置方法的返回值到页面 -->
<result name="ok">/hello.jsp</result>
</action>
</package> </struts>

把单独配置文件引入核心配置文件中

<?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> <!-- 引入hello.xml文件
使用include标签
file属性:单独配置文件的全路径
-->
<include file="cn/action/hello.xml"></include> </struts>

二、访问action的三种方式

  方式1:通过action中的method属性访问

      1、在action中创建多个方法

        

      2、使用method标签配置

        

        

  方式2:通过通配符的方式访问

      1、在action标签里面name属性,name属性值里面写 符号 *  星号

        * 理解: 表示匹配任意内容

        - 比如访问hello,* 可以匹配到

        - 比如访问add,* 可以匹配到

        method属性值为“*”的值。建议固定写{1},表示一个“*”号

        

        

  

  方式3:动态访问实现(不用)

 详细配置如下     

<?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> <!-- 配置action的方法访问 -->
<!-- <package name="methoddemo" extends="struts-default" namespace="/">
有method属性:写要执行的action里面的方法的名称
<action name="addAction" class="cn.itcast.method.BookAction" method="add"></action>
执行update方法
<action name="updateAction" class="cn.itcast.method.BookAction" method="update"></action>
</package> -->
<!-- 通配符方式实现 -->
<package name="methoddemo" extends="struts-default" namespace="/">
<!--
name属性值里面写符号 *
(1)执行action里面的add方法,访问 book_add,使用book_*可以匹配到,*相当于变成 add (2)执行action里面的update方法,访问book_update,使用book_*可以匹配到,*相当于变成 update
上面两个路径使用 book_* 可以匹配到
method属性写*值,几{1} 固定写法
-->
<action name="book_*" class="cn.itcast.method.BookAction" method="{1}">
</action>
</package>
</struts>

三、action获取表单数据(3种方式)

  1、使用ActionContext类  

    1、创建表单

    

<%@ 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 }/data1.action" method="post">
username:<input type="text" name="username"/>
<br/>
password:<input type="text" name="password"/>
<br/>
address:<input type="text" name="address"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

    2、在action中使用ActionContext获取数据

      

      

public class Form1DemoAction extends ActionSupport {

    public String execute() throws Exception {
//第一种方式 使用ActionContext类获取
//1 获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2 调用方法得到表单数据
// key是表单输入项name属性值,value是输入的值
Map<String, Object> map = context.getParameters(); Set<String> keys = map.keySet();
for (String key : keys) {
//根据key得到value
//数组形式:因为输入项里面可能有复选框情况
Object[] obj = (Object[]) map.get(key);
System.out.println(Arrays.toString(obj));
} return NONE;
}
}

  2、使用ServletActionContext类获取

    

    

public class Form2DemoAction extends ActionSupport {

    public String execute() throws Exception {
//第一种方式 使用ServletActionContext类获取
//1 使用ServletActionContext获取request对象
HttpServletRequest request = ServletActionContext.getRequest();
//2 调用request里面的方法得到结果
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address"); System.out.println(username+":"+password+":"+address); return NONE;
}
}

  3、使用接口注入方式(了解):让action实现接口,为了得到request对象

public class Form3DemoAction extends ActionSupport implements ServletRequestAware {

    private HttpServletRequest request ;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
} public String execute() throws Exception {
request.getParameter(""); return NONE;
} }

四、Struts封装获取的表单数据(4种方式)

  1、使用最原始的方式将获取的数据封装到实体类对象中

    1、创建实体类

      

public class User {

    private String username;
private String password;
private String address;
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", address=" + address + "]";
} }

     2封装数据

      

public class Form4DemoAction extends ActionSupport {

    public String execute() throws Exception {
//1 获取表单数据
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address"); //2 封装到实体类对象里面
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address); System.out.println(user);
return NONE;
} }

  2、属性封装:直接把表单数据提交,封装到cation的属性里面

    注意:使用属性封装获取表单数据封装到属性里面,不能把数据直接封装到实体类对象里

    步骤:1、在action成员变量位置定义属性(变量)

         变量名称和表单输入项的name属性值一样

       2、生成属性的set方法(记不住是get还是set,建议都写出来)

public class DataDemo1Action extends ActionSupport {

    //1 定义变量
//变量的名称和表单输入项name属性值一样
private String username;
private String password;
private String address; //2 生成变量的set和get方法
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;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Override
public String execute() throws Exception {
System.out.println(username+":"+password+":"+address);
return NONE;
} }

  3、驱动模型封装(重点)

    1、使用模型驱动方式,可以直接把表单数据封装到实体类对象里面

    2、实现步骤

     (1)action实现接口 ModelDriven

     (2)实现接口里面的方法 getModel方法

          - 把创建对象返回

     (3)在action里面创建实体类对象

    注意:在一个action中,获取表单数据可以使用属性封装或者使用模型驱动封装,

       不能同时使用属性封装和模型驱动封装获取同一个表单数据

       如果同时使用,只会执行模型驱动

public class DataDemo2Action extends ActionSupport implements ModelDriven<User>{//泛型直接写实体类的名字

    //第3步:创建对象
//前提要求: 表单输入项name属性值 和 实体类属性名称一样
private User user = new User();
  //第2步:实现getModel方法
public User getModel() {
//返回创建user对象
return user;
} @Override
public String execute() throws Exception { System.out.println(user);
return NONE;
}

  4、表达式封装(相当于属性封装)

    1、使用表达式封装可以把表单数据封装到实体类对象里面

    实现步骤:

        1、在action里面声明实体类

        2、生成实体类变量的set和get方法

        3、在表单输入项的name属性值里面写表达式形式

  


public class DataDemo3Action extends ActionSupport {

    //1 声明实体类
private User user; private Book book; //2 生成实体类变量的set和get方法
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
} public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
} @Override
public String execute() throws Exception {
System.out.println(user);
System.out.println(book.getBname());
return NONE;
}

 

表单代码:在表单输入项的name属性值里面写表达式形式

<%@ 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 }/data3.action" method="post">
username:<input type="text" name="user.username"/>
<br/>
password:<input type="text" name="user.password"/>
<br/>
address:<input type="text" name="user.address"/>
<br/>
bname: <input type="text" name="book.bname"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

  5、表达式封装和模型封装的区别

    1 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面

    2 不同点:

      (1)使用模型驱动只能把数据封装到一个实体类对象里面

      - 在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面

      (2)使用表达式封装可以把数据封装到不同的实体类对象里面

五、将数据封装到List集合,可以获取多个封装对象

  步骤:

      第一步 在action声明List

      第二步 生成list变量的set和get方法

      第三步 在表单输入项里面写表达式

public class ListAction extends ActionSupport {

    // 1 声明List变量,可以获取多个用户对象
private List<User> list;
// 2 生成get和set方法
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
} @Override
public String execute() throws Exception {
System.out.println(list);
return NONE;
} }

表单数据:第三步 在表单输入项里面写表达式

<%@ 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 }/list.action" method="post">
<!-- list[0] : 表示list集合中第一个user对象 -->
username:<input type="text" name="list[0].username"/>
<br/>
password:<input type="text" name="list[0].password"/>
<br/>
address:<input type="text" name="list[0].address"/> <br/><br/>
<!-- list[1] : 表示list集合中第二个user对象 -->
username:<input type="text" name="list[1].username"/>
<br/>
password:<input type="text" name="list[1].password"/>
<br/>
address:<input type="text" name="list[1].address"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

六、将数据封装到Map集合

    步骤:

      第一步 声明map集合

      第二步 生成get和set方法

      第三步 在表单输入项的name属性值里面写表达式

public class MapAction extends ActionSupport {

    // 1 声明map集合
private Map<String,User> map;
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
} @Override
public String execute() throws Exception {
System.out.println(map);
return NONE;
} }

表单数据  第三步:在表单输入项的name属性值里面写表达式

<%@ 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 }/map.action" method="post">
<!-- 设置key值 map['key值'], 可以任意取名
设置value值 .你想获取的对象的属性值名
-->
username:<input type="text" name="map['one'].username"/>
<br/>
password:<input type="text" name="map['one'].password"/>
<br/>
address:<input type="text" name="map['one'].address"/> <br/><br/> username:<input type="text" name="map['abcd'].username"/>
<br/>
password:<input type="text" name="map['abcd'].password"/>
<br/>
address:<input type="text" name="map['abcd'].address"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

Struts2(2)的更多相关文章

  1. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  2. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  5. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  6. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  7. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

  8. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  9. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  10. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

随机推荐

  1. Unity3D游戏开发从零单排(六) - 人物运动及攻击连击

    提要 今天要实现的是一个简单人物控制器. 包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画.尽管unity3d自带有charactorcontroller, ...

  2. 【zabbix】zabbix忘记密码,重置密码

    忘记密码这种事经常会发生,这里我们介绍一种zabbix忘记用户密码的处理方式. 原理: zabbix存储在数据库中用户名密码是经过32位,小写,md5加密过的.我们可以手动修改数据库中用户的密码. 实 ...

  3. Linux 路径与命令搜寻顺序

    以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』: 由 alias 找到该命令来运行: 由 bash 内建的 (builtin) 命令来运行: 透过 $PATH 这个变量的顺序搜 ...

  4. Linux查看某个端口+gcc动态编译

    Linux下就: 1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 gcc:动态编译 gcc –fpic –c file.c –o file.o gcc –shared ...

  5. 《高级程序设计》8 BOM

    window对象 location对象 navigator对象 screen对象 history对象 一.window对象 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,wind ...

  6. pearson相关分析在R中的实现

    三个相关性函数: cor():R自带的,输入数据可以是vector,matrix,data.frame,输出两两的相关系数R值 cor.test():R自带的,输入数据只能是两个vector,输出两个 ...

  7. Android编译系统环境过程初始化分析【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/18928789 Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就 ...

  8. UVA639 二叉树

    题意:深度为n的二叉树每个节点上有个开关,初始为关闭,每当小球落在节点上都会改变开关的状态,问编号为m的小球最终会落在哪里. 思路:对于二叉树的节点k,左节点右节点的编号为2k,2k+1.只需由最后一 ...

  9. 网络安全-跨站脚本攻击XSS(Cross-Site Scripting)

    一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者 ...

  10. 【P2564】生日礼物(单调队列)

    这个题看上去状态比较多,实际上由于题目的输出需要,又因为是一个线性的结构,所以我们可以有一些操作. 这么想,如果我们有了一个满足条件的区间,此时我们缩减左端点,然后判断此时是否还是满足,满足就继续缩减 ...