Struts2框架应用于javaee三层框架中的web层。是在Struts1和webwork基础上发张的一个全新的框架。
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配置:
/hello.jsp
4、在web.xml配置文件配置过滤器:
ssh-test
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
5、访问路径:http://localhost:8080/ssh-test/hellotest
至此,一个最基本的struts2项目就已经搭建完毕。
1、Struts2的基本执行流程:
2、structs2的过滤器在服务端启动的时候创建,创建的时候会执行init方法,init方法中主要加载配置文件,包含自己创建的配置文件和struts自带文件。
3、Struts2核心配置文件:
文件名称和位置固定;在配置文件中主要有三个标签package、action、result,以及标签里面的属性。
(1)package标签:
类似于代码包,区别不同的action,必须首先写package标签,在package里面才能配置action。
package标签属性:
①name:name属性值跟功能本身没有关系。
②extends:extends="struts-default",属性值是固定的,struts-default。写了这个属性之后,在package里面的类具有action功能。
③namespace:namespace属性值和action标签里面的name属性值构成访问路径。
(2)action标签:
action标签配置action访问路径:
action标签属性:
①name:package标签的namespace属性值和action标签里面的name属性值构成访问路径。在package标签里面可以写多个action标签,但是action标签的属性值不能相同。
②class:action的全路径。
③method:在action里面默认执行的方法execute方法,如果想执行action里面的其他方法,使用method进行配置。
(3)result标签:
/hello.jsp
根据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里面的方法,如果有返回值得时候类型必须是String。
②action里面的方法可以没有返回值,没有返回值的时候,在result标签不需要配置。
--把方法写成void
--让返回值,返回“none”。
6、结果页面配置:(struts.xml文件)
有两种配置方式,全局结果以及局部结果页面,同时配置两个的话,只有局部结果页面生效。
(1)全局结果页面配置:如果多个action的返回值相同,跳转的页面也相同,则可以使用全局结果页面配置。
/hello.jsp
(2)局部结果页面配置:
/hello.jsp
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 map=context.getParameters();
Set 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;
@Override
public 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配置:
页面:
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 {
//2.创建对象
//前提要求:表单输入项的name属性值要和实体类属性名称一样
User user=new User();
//3.实现接口里面的getModel方法,并把对象返回
@Override
public 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 list;
//2.生成集合的set和get方法:
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public String execute(){
System.out.println(list);
return NONE;
}
}
(3)在表单输入项写表达式:
5、封装数据到Map集合:
(1)在action声明map;
(2)生成map变量的set和get方法:
//封装数据到Map集合:
public class MapDemoAction extends ActionSupport {
//1.在action中声明Map
private Map map;
//2.生成Map变量的set和get方法:
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public String execute(){
System.out.println(map);
return NONE;
}
}
(3)在表单输入项写表达式: