Struts2框架--学习笔记(上):搭建struts2工程、struts2基本概念、struts2对页面数据的操作
概述:
Struts2框架应用于javaee三层框架中的web层。是在Struts1和webwork基础上发张的一个全新的框架。
一、搭建一个最基本的struts2工程步骤:
1、导入基本的jar包依赖:
2、创建action:
首先:比较一下servlet和struts2的action的区别:
(1)每次访问servlet的时候,都会执行service方法。
写类继承httpServlet,重写里面的方法。并在web.xml文件配置servlet的访问路径。
(2)每次执行action,默认执行execute的方法。
//action类
public class HelloAction {//每次访问action的时候,默认执行execute方法。public String execute(){return "success";}
}
3、配置action类的访问路径:
(1)创建struts2核心配置文件,核心配置文件名称和位置是固定的,位置必须在src下面,名称是struts.xml;
(2)在struts.xml引入dtd约束;
(3)Action配置:
<?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">
<!-- 以上为引入的dtd约束 -->
<struts><!-- action的配置 --><package name="HelloDemo" extends="struts-default" namespace="/"><!-- name:配置访问路径 --><action name="hellotest" class="com.zwp.action.HelloAction" method="execute"><!-- 配置方法的返回值到页面 --><result name="ok" type="dispatcher">/hello.jsp</result></action></package>
</struts>
4、在web.xml配置文件配置过滤器:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><display-name>ssh-test</display-name><!-- 配置struts2过滤器 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
5、访问路径:http://localhost:8080/ssh-test/hellotest
至此,一个最基本的struts2项目就已经搭建完毕。
二、Struts2的基本概念:
1、Struts2的基本执行流程:
2、structs2的过滤器在服务端启动的时候创建,创建的时候会执行init方法,init方法中主要加载配置文件,包含自己创建的配置文件和struts自带文件。
3、Struts2核心配置文件:
文件名称和位置固定;在配置文件中主要有三个标签package、action、result,以及标签里面的属性。
(1)package标签:
<package name="HelloDemo" extends="struts-default" namespace="/">
类似于代码包,区别不同的action,必须首先写package标签,在package里面才能配置action。
package标签属性:
①name:name属性值跟功能本身没有关系。
②extends:extends="struts-default",属性值是固定的,struts-default。写了这个属性之后,在package里面的类具有action功能。
③namespace:namespace属性值和action标签里面的name属性值构成访问路径。
(2)action标签:
<action name="hellotest" class="com.zwp.action.HelloAction" method="execute">
action标签配置action访问路径:
action标签属性:
①name:package标签的namespace属性值和action标签里面的name属性值构成访问路径。在package标签里面可以写多个action标签,但是action标签的属性值不能相同。
②class:action的全路径。
③method:在action里面默认执行的方法execute方法,如果想执行action里面的其他方法,使用method进行配置。
(3)result标签:
<result name="ok" type="dispatcher">/hello.jsp</result>
根据action的方法的返回值,配置到不同的路径里面。
result属性:
①name:和方法返回值一样。
②type(重点):配置如何到路径中(转发或者重定向)。
---type属性默认值是做转发操作,值是dispatcher。
---做重定向操作,值是redirect。
--上面两个值一般针对到页面中的配置,如果想要配置到其他的action:
--chain:转发到action,一般不用,存在缓存问题
--redirectAction:重定向到action。
4、action的编写方式:
(1)第一种:创建普通类,这个类不能继承任何累,不实现任何接口。
(2)第二种:创建类,实现接口Action
(3)第三种:创建类,继承ActionSupport(一般使用这个方式)
5、访问action的方法(重点):
(1)第一种:使用action标签的method属性,在这个属性里面写执行的action的方法。
(2)第二种:使用通配符方式实现(重点):
(3)第三种:动态访问实现(不用)
<!--访问action的三种方法(重点): --><!-- 第一种:使用action标签的method属性,在这个属性里面写执行的action的方法。 --><!-- name: 访问名称 method:默认为execute --><action name="addAction" class="com.zwp.action.HelloAction" method="add"></action><action name="updateAction" class="com.zwp.action.HelloAction" method="update"></action><!-- 第二种:使用通配符方法实现(重点) --><!-- *:是访问名称; {1}:第一个*的内容 --><action name="action_*" class="com.zwp.action.HelloAction" method="{1}"></action>
①在action里面的方法,如果有返回值得时候类型必须是String。
②action里面的方法可以没有返回值,没有返回值的时候,在result标签不需要配置。
--把方法写成void
--让返回值,返回“none”。
6、结果页面配置:(struts.xml文件)
有两种配置方式,全局结果以及局部结果页面,同时配置两个的话,只有局部结果页面生效。
(1)全局结果页面配置:如果多个action的返回值相同,跳转的页面也相同,则可以使用全局结果页面配置。
<!-- 全局结果页面配置:只适用于同一个package里面的action -->
<global-results><result name="success">/hello.jsp</result>
</global-results>
(2)局部结果页面配置:
<action name="hellotest" class="com.zwp.action.HelloAction" method="execute"><!-- result标签配置方法的返回值到页面 --><result name="ok" type="dispatcher">/hello.jsp</result>
</action>
三、Struts2对页面数据的操作:
1、获取表单提交的数据:
(1)在web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap。
(2)提交表单到action,但是action没有request对象,不能直接使用request对象。
(3)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;}
}
②使用ServletActionContext:
public String execute() throws Exception{//获取表单提交数据第二种方式 :使用ServletActionContext类获取//1.获取ServletActionContext对象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;}
③:使用接口注入(了解):
public class Form3DemoAction extends ActionSupport implements ServletRequestAware{//获取表单提交数据:第三种方式 :使用接口注入private HttpServletRequest request;@Overridepublic void setServletRequest(HttpServletRequest request) {this.request=request; }public String execute() throws Exception{ String username=request.getParameter("username");String password=request.getParameter("password");String address=request.getParameter("address");System.out.println(username+":"+password+":"+address);return NONE;}
}
④struts.xml配置:
<!-- 获取表单提交的数据: -->
<action name="form1" class="com.zwp.action.Form1DemoAction"></action>
<action name="form2" class="com.zwp.action.Form2DemoAction"></action>
<action name="form3" class="com.zwp.action.Form3DemoAction"></action>
页面:
<body><form action="${pageContext.request.contextPath }/form1.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>
2、在aciton中操作域对象:
(1)request、session、servletContext:
(2)使用SetvletActionContext:
public String execute() throws Exception{ //在action操作域对象//操作的三个域对象//1.request域HttpServletRequest request=ServletActionContext.getRequest();request.setAttribute("req","reqValue");//2.session域HttpSession session=request.getSession();session.setAttribute("ses", "sesValue");//3.ServletContext域ServletContext servletcontext=ServletActionContext.getServletContext();servletcontext.setAttribute("con", "conValue");return NONE;}
3、获取表单提交数据封装到实体类中去:
(1)原始方式获取表单数据封装到实体类中去:
//获取表单数据封装到实体类对象中去:
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.toString());return NONE;}
}
(2)属性封装:获取表单数据到属性里面,不能把数据直接封装到实体类对象里面:
//获取表单数据封装到实体类对象中去:
public class Form5DemoAction 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;}public String execute() throws Exception{System.out.println(username+":"+password+":"+address);return NONE;}
}
(3)模型驱动封装(重点):
①使用模型驱动方式,可以直接把表单数据封装到实体类对象里面。
要求:表单输入项的name属性值和实体类属性的名称一样。
②步骤:
--在action里面接口ModelDriven
--在action里面创建实体类对象
--实现接口里面的getMddel()方法,把对象返回。
//获取表单数据封装到实体类对象中去:
//第三种方式:驱动封装:(重点)//1.实现ModelDriven接口:
public class Form6DemoAction extends ActionSupport implements ModelDriven<User> {//2.创建对象//前提要求:表单输入项的name属性值要和实体类属性名称一样User user=new User();//3.实现接口里面的getModel方法,并把对象返回@Overridepublic User getModel() { return user;}public String execute(){ System.out.println(user.toString());return NONE;}
}
在一个action中,获取表单数据可以使用属性封装,也可以使用模型驱动封装,但是不能同时使用属性封装和模型驱动封装获取同一个表单数据。如果同时使用,只会执行模型驱动。
(4)表达式封装:数据封装到对象中去:
①第一步:在action里面声明实体类;
②第二步:生成实体类变量的set和get方法。
//1.声明实体类
private User user;
//2.生成实体类变量的set和get方法
public User getUser(){return user;
}
public void setUser(User user){this.user=user;
}
③第三步:在表单输入项的name属性值里面写表达式形式:
(5)比较表达式封装和模型驱动封装:
①使用表达式封装和模型驱动封装都可以把数据封装到实体类对象那个里面
②不同点:
--使用模型驱动只能把数据封装到一个实体类对象里面;在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面。
--使用表达式封装可以把数据封装到不同的实体类对象里面。
4、封装数据到List集合:
(1)在action声明List:
(2)生成List变量的set和get方法
//封装数据到list:
public class ListDemoAction extends ActionSupport {//1.声明List集合:private List<User> list;//2.生成集合的set和get方法:public List<User> getList() {return list;}public void setList(List<User> list) {this.list = list;}public String execute(){System.out.println(list);return NONE; }
}
(3)在表单输入项写表达式:
<!-- 封装数据到List集合 --><!-- 3.在表单输入项写表达式: --><form action="${pageContext.request.contextPath }/list.action" method="post"><!-- 表示第一个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/><!-- 表示第二个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>
5、封装数据到Map集合:
(1)在action声明map;
(2)生成map变量的set和get方法:
//封装数据到Map集合:
public class MapDemoAction extends ActionSupport {//1.在action中声明Mapprivate Map<String,User> map;//2.生成Map变量的set和get方法:public Map<String, User> getMap() {return map;}public void setMap(Map<String, User> map) {this.map = map;}public String execute(){System.out.println(map);return NONE;}
}
(3)在表单输入项写表达式:
<!-- 封装数据到Map集合 --><!-- 3.在表单输入项写表达式: --><form action="${pageContext.request.contextPath }/map1.action" method="post"><!-- 表示第一个User对象 -->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/><!-- 表示第二个User对象 -->username:<input type="text" name="map['two'].username"/><br/>password:<input type="text" name="map['two'].password"/><br/>address:<input type="text" name="map['two'].address"/><br/><input type="submit" value="添加"/></form>
Struts2框架--学习笔记(上):搭建struts2工程、struts2基本概念、struts2对页面数据的操作相关推荐
- Struts2框架--学习笔记(下):OGNL表达式、值栈操作、拦截器、struts2标签、文件上传
一.OGNL概述:OGNL是一种表达式 (1)在struts2中操作值栈数据. (2)一般把ognl在struts2中操作,和struts2标签一起使用操作值栈. (3)ognl不是strut2的一部 ...
- Struts2框架学习笔记_Struts2入门
文章为学习struts的笔记,可供读者参考,有不足之处还望之指出. 参考: POJO与JavaBean的区别 Velocity Velocity官网 FreeMarker XSLT struts2 学 ...
- Struts2框架学习笔记1
1,框架概述 1.1,什么是框架(了解) 将一些重复性的代码进行封装,简化程序员的编程操作,可以使得程序员在编码中把更多的精力放到业务需求的分析和理解上面,相当于一个半成品软件. 1.2,三大框架(掌 ...
- Struts2框架学习笔记_OGNL与标签库
OGNL Struts2标签分类 控制标签 一.OGNL Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过其简单一致的表达式语法,可以存取对象的 ...
- Springboot框架学习笔记------项目搭建、程序解析、配置文件的作用
今天开始学习spring boot,这个框架整合spring和springmvc,简化了很多的配置,这是目前的理解. 搭建流程: 1.从idea搭建,利用maven创建项目,前提是联网,需要下载mav ...
- SpringMVC框架--学习笔记(上)
1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Java之struts2框架学习
About Struts2 Struts也是一款MVC框架 , Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全新的Struts2框架 其全新的S ...
- mybatis框架--学习笔记(上)
使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...
最新文章
- PTA 基础编程题目集 7-21 求特殊方程的正整数解 C语言
- 计算机用于尖端科技,【判断题】用演绎法教问句的方法适用于中高级型学生
- 浅谈RTS游戏网络同步:3种同步机制模式的实现
- linux 自动安装 yum,LINUX6安装YUM仓库和实现开机自动挂载
- php tls,使用TLS在PHP中建立连接
- 安装两个mysql3308_在同一台机器上安装两个版本的MySQL
- oracle mrp mps mds 的table关联,ORACLE中的计划-Forecast/MDS/MPS/MRP(转)
- Protel 99 SE 的坑
- Android测试之Robotium自动化测试框架
- 树莓派 | RSSHub+TTRSS
- 苗圩:5G技术将八成用于移动物联网 年内适时发放5G牌照
- 首款物联网防火墙himqtt开源
- chrome提示代理(https://....)要求提供用户名和密码
- 计算机专业转段考试,计算机信息技术学院完成计算机网络技术专业3+2本科转段考试工作...
- 面试官:首屏加载速度慢怎么解决?
- Python实用脚本/算法集合, 附源代码下载
- vscode remote-ssh连接ubuntu子系统提示错误:WSL: VSCode server install fails on Ubuntu 19.10
- OpenCv中Numpy常用函数
- BP神经网络简单流程
- mfc异形窗口的创建
热门文章
- 十一、练习:爬取图虫网付费图片
- pytroch 中Variable实现线性回归
- Vue 学习 第六天学习笔记
- 浙江大学杭州国际科创中心招聘优秀青年人才(机器学习及大数据)
- ECCV 2020 SenseHuman Workshop:人类感知、理解与生成
- ACL 2020 | MobileBERT:一种与任务无关的模型压缩方法
- Waymo 2020 | 2D/3D目标检测、跟踪和域自适应性冠军解决方案解析
- ICCV 2019 开源论文 | ShapeMatchingGAN:打造炫酷动态的艺术字
- 每周一起读 | ACL 2019 NAACL 2019:文本关系抽取专题沙龙
- 重磅公开课推荐 | 如何搭建聊天机器人:技术架构剖析