struts2访问Servlet的API
方式一:完全解耦合-通过ActionContext类访问
ActionContext中保存action执行所需要的一些对象,包括:parameters、request、session、application。下面是ActionContext类访问Servlet API的几个常用方法
使用案例
访问servlet的api的方式一:完全解耦合(只能访问map数据,不能获取请求头、ip等
public class RequestDemo1 extends ActionSupport{
@Override
public String execute() throws Exception {
//1.接受参数:利用struts2中的对象ActionContext对象
ActionContext context=ActionContext.getContext();
//调用ActionContext中的方法
//类似于Map<string,string[]> request.getParameterMap()
Map<String, Object> map=context.getParameters();//这里只能返回 Map<String, Object>
for(String key:map.keySet()){
System.out.println(key+":"+Arrays.toString( (String[])map.get(key) ));
}
//2.向域对象中存入数据
context.put("reqName", "reqValue1");//相当于request.setAttribute
context.getSession().put("sessName", "sessValue1");
context.getApplication().put("appName", "appValue");
return SUCCESS;
}
}
方式二:使用Servlet的API的原生方式
ServletActionContext类包含了几个常用的静态方法
使用案例
public class RequestDemo2 extends ActionSupport {
@Override
public String execute() throws Exception {
//接收数据
//直接获得request对象,通过servletActionContext
HttpServletRequest request=ServletActionContext.getRequest();
Map<String, String[]> map=request.getParameterMap();
for (String key:map.keySet()) {
System.out.println(key+":"+Arrays.toString(map.get(key)));
}
//向域对象中保存数据
request.setAttribute("reqName", "reqValue2");
request.getSession().setAttribute("sessName", "sessValue2");
ServletActionContext.getServletContext().setAttribute("appName", "appValue2");
return SUCCESS;
}
}
方式三:接口注入
通过ActionContext无法获取到Servlet API实例,但是通过接口注入的方式,可以获得API实例
使用案例
//接口注入方式来访问servlet的api
public class RequestDemo3 extends ActionSupport implements ServletRequestAware,ServletContextAware {
//这里就实现了两个接口,相关变量要提供set方法
private HttpServletRequest request;
private ServletContext context;
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
}
@Override
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
this.context=context;
}
@Override
public String execute() throws Exception {
//接受参数
Map<String, String[]> map=request.getParameterMap();//使用request的方法
for (String key:map.keySet()) {
System.out.println(key+":"+Arrays.toString(map.get(key)));
}
//向域对象中保存数据
request.setAttribute("reqName", "reqValue3");
request.getSession().setAttribute("sessName", "sessValue3");
context.setAttribute("appName", "appValue3");
return super.execute();//就是返回success
}
}
结果页面的配置
1.全局页面
<!-- 全局结果页面配置 -->
<global-results>
<result name="success">/demo1/demo2.jsp</result>
</global-results>
2.局部页面
<action name="requestDemo1" class="com.itheima.struts2.demo1.RequestDemo1">
<!-- 局部结果页面配置 :只对这个action有效-->
<result name="success">/demo1/demo2.jsp</result>
</action>
属性
struts2的数据封装
1.属性驱动-提供属性set方法(很少用)
在action中定义基本属性字段(要和表单对应),利用这些字段来进行数据传递
//数据封装-属性驱动--提供set方法
//这种方法不常用,因为比较繁琐
public class UserAction1 extends ActionSupport {
//提供对应的属性
private String username;
private String password;
private Integer age;
private Date birthday;
private double salary;
//提供属性对应的set方法
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String execute() throws Exception {
//接收数据
System.out.println(username);
System.out.println(password);
System.out.println(age);
System.out.println(birthday);
System.out.println(salary);
//封装数据
User user=new User();
user.setAge(age);
user.setUsername(username);
user.setPassword(password);
user.setSalary(salary);
user.setBirthday(birthday);
return NONE;
}
}
页面编写
<form action="${pageContext.request.contextPath }/userAction1.action" method="post">
用户名:<input type="text" name="username" /></br>
密码:<input type="password" name="password" /></br>
年龄:<input type="text" name="age" /></br>
生日:<input type="text" name="birthday"/></br>
工资:<input type="text" name="salary"></br>
<input type="submit" value="提交">
</form>
2.属性驱动-页面提供表达式OGNL
这里需要提供对象的get方法
//数据封装-属性驱动-页面提供表达式
public class UserAction2 extends ActionSupport{
//提供一个User对象
private User user;
//一定要一共get方法
//因为拦截器完成数据封装,需要用到User对象
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
这种方式呢,页面编辑就有一定要求
<h3>方式二:属性驱动-页面提供表达式的方式</h3>
<form action="${pageContext.request.contextPath }/userAction3.action" method="post">
用户名:<input type="text" name="user.username" /></br>
密码:<input type="password" name="user.password" /></br>
年龄:<input type="text" name="user.age" /></br>
生日:<input type="text" name="user.birthday"/></br>
工资:<input type="text" name="user.salary"></br>
<input type="submit" value="提交">
</form>
3.模型驱动
这种方式需要实现接口+手动创建对象
//数据封装-模型驱动 (最常用)
public class UserAction3 extends ActionSupport implements ModelDriven<User>{
private User user=new User();//利用模型(需要和表单对应)
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
编写页面
<h3>方式三:模型驱动</h3>
<form action="${pageContext.request.contextPath }/userAction3.action" method="post">
用户名:<input type="text" name="username" /></br>
密码:<input type="password" name="password" /></br>
年龄:<input type="text" name="age" /></br>
生日:<input type="text" name="birthday"/></br>
工资:<input type="text" name="salary"></br>
<input type="submit" value="提交">
</form>
struts2封装集合类型数据
1.封装到list
//复杂数据封装:封装到list
public class ProductAction1 extends ActionSupport{
private List<Product> products;
//提供集合的set和get方法
public void setProducts(List<Product> products) {
this.products = products;
}
public List<Product> getProducts() {
return products;
}
@Override
public String execute() throws Exception {
for(Product product:products){
System.out.println(product);
}
return NONE;
}
}
<h3>封装到List集合中:批量插入商品</h3>
<form action="${pageContext.request.contextPath }/productAction1.action"" method="post">
商品名称:<input type="text" name="products[0].name"><br/>
商品价格:<input type="text" name="products[0].price"><br/>
商品名称:<input type="text" name="products[1].name"><br/>
商品价格:<input type="text" name="products[1].price"><br/>
商品名称:<input type="text" name="products[2].name"><br/>
商品价格:<input type="text" name="products[2].price"><br/>
<input type="submit" value="提交">
</form>
2.封装到map
//复杂数据封装:封装到MAP
public class ProductAction2 extends ActionSupport{
private Map<String, Product> map;
public Map<String, Product> getMap() {
return map;
}
public void setMap(Map<String, Product> map) {
this.map = map;
}
@Override
public String execute() throws Exception {
for(String key:map.keySet()){
Product product=map.get(key);
System.out.println(key+":"+product);
}
return NONE;
}
}
<h3>封装到Map集合中:批量插入商品</h3>
<form action="${pageContext.request.contextPath }/productAction2.action"" method="post">
商品名称:<input type="text" name="map['one'].name"><br/>
商品价格:<input type="text" name="map['one'].price"><br/>
商品名称:<input type="text" name="map['two'].name"><br/>
商品价格:<input type="text" name="map['two'].price"><br/>
商品名称:<input type="text" name="map['three'].name"><br/>
商品价格:<input type="text" name="map['three'].price"><br/>
<input type="submit" value="提交">