Struts2的ServletAPI的获取和各种类型的数据获取(三)中

简介: Struts2的ServletAPI的获取和各种类型的数据获取(三)

一.三 使用 ServletActionContext 工具类获取ServletAPI


一.三.一 ServletActionContext 提供方法


image.png


session依旧是通过 request 进行获取的。


一.三.二 编写Demo 验证一下


一.三.二.一 编写Action 类 ServletActionContextDemo


public class ServletActionContextDemo extends ActionSupport{
  private static final long serialVersionUID = 1L;
  private String name;
  public String showData(){
    //获取application对象
    ServletContext application=ServletActionContext.getServletContext();
    //获取request对象
    HttpServletRequest request=ServletActionContext.getRequest();
    //获取response对象
    HttpServletResponse response=ServletActionContext.getResponse();
    //获取session对象
    HttpSession session=request.getSession();
    //获取application的值
    Integer count=(Integer)application.getAttribute("count"); 
    if(count==null){  
      count=1;
    }else{
      count=count+1;
    }
    //设置application的值
    application.setAttribute("count",count);
    //放置到session域 
    session.setAttribute("loginName",name);
    if("两个蝴蝶飞".equals(session.getAttribute("loginName"))){
      //放置到request域
      request.setAttribute("msg","第三种方式:欢迎您,"+session.getAttribute("loginName"));
      //展示ip 地址
      request.setAttribute("ip",request.getLocalAddr());
      //通过response 对象,设置cookie 
      Cookie cookie=null;
      try {
        cookie = new Cookie("userName",
            URLEncoder.encode(session.getAttribute("loginName").toString(),"UTF-8"));
      } catch (UnsupportedEncodingException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
      cookie.setMaxAge(60*60);
      cookie.setPath("/");
      response.addCookie(cookie);
      //返回success 
      return SUCCESS;
    }
    //放置到request域
    request.setAttribute("msg","服务器提示:登录失败");
    return ERROR;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}


一.三.二.二 配置struts.xml 文件


<!-- 配置第三种方式 -->
<action name="servletDemo" class="com.yjl.web.action.ServletActionContextDemo"
method="showData">
  <result name="success">/WEB-INF/content/success2.jsp</result>
  <result name="error">/WEB-INF/content/error.jsp</result>
</action> 


一.三.二.三 编写 jsp文件


用的是上面的 success2.jsp 文件,不需要重复编写。


一.三.二.四 重启服务器,进行验证


输入网址: http://localhost:8080/Struts_API/servletDemo?name=两个蝴蝶飞


image.png


通过 ServletActionContext 工具类,获取request,response,session,application 对象,比较好,一般采用这种方式。


但是不通过这种方式来获取前端传递过来的数据,获取数据,struts2框架提供了更简单的方式。


二. 获取前端数据


二.一. 通过原始的 request 对象进行获取数据


二.一.一 编写Action


public class RequestData extends ActionSupport{
  private static final long serialVersionUID = -477463776005071632L;
  Logger logger=Logger.getLogger(RequestData.class);
  public String getData() {
    //有一个ServletActionContext对象来获取底层的HttpServletRequest
    HttpServletRequest request=ServletActionContext.getRequest();
    //如果获取的是单个数据,如text框,password,hidden,radio性别框,select单选框等。
    String userName=request.getParameter("userName");
    //如果获取的是checkbox,select多选框.
    String []hobbys=request.getParameterValues("hobbys");
    logger.info("姓名是:"+userName);
    if(hobbys!=null) {
      for (String hobby : hobbys) {
        logger.info("爱好有:"+hobby);
      }
    }
    return NONE;
  }
}


二.一.二 配置struts.xml


<!-- 通过获取request来获取前端数据 -->
<action name="requestData" class="com.yjl.web.action.RequestData"
method="getData">
</action>
<!-- 配置跳转页面,要把它放置到最后 -->
<action name="*">
  <result>/WEB-INF/content/{1}.jsp</result>
</action>


二.一.三 编写前端界面


要配置跳转页面的 action


在 /content 文件夹下,创建一个 request.jsp 页面


<body>
  <form action="requestData" method="post">
    用户名:<input type="text" name="userName"><br/>
    爱好: <input type="checkbox" name="hobbys" value="读书"> 读书
    <input type="checkbox" name="hobbys" value="编程"> 编程
    <input type="checkbox" name="hobbys" value="写小说">写小说<br/>
    <input type="submit" value="提交">
    </form>
</body>


二.一.四 重启服务器,进行验证


输入网址: http://localhost:8080/Struts_API/request , 会跳转到 /WEB-INF/content/request.jsp 页面,


20200412122104311.png


名称填写 两个蝴蝶飞,爱好是编程和写小说


20200412122108881.png


前端正常跳转,后端控制台打印输出:


20200412122113910.png


ServletActionContext类可以直接获取request对象,response对象,application 对象,可以通过request.getSession()来获取session对象,


但是这种方式获取数据与Servlet产生了高度耦合,若非一些特殊数据需求,如客户端的ip地址,端口号等,不建议使用这种方式。而是采用 struts2框架提供的方式,来获取数据。


下面的例子,都可以正常访问,就不一 一 贴运行效果图了。struts.xml 的配置也很简单,也不一个一 个贴配置文件了。


二.二 通过 Struts2 框架提供的方式进行获取数据


二.二.一 Struts2获取单个普通的单值,如字符串和Integer 值


二.二.一.一 Demo展示


public class SimpleData extends ActionSupport{
  private static final long serialVersionUID = -477463776005071632L;
  Logger logger=Logger.getLogger(SimpleData.class);
  //name为单个值
  private String name;
  public void setName(String name) {
    this.name=name;
  }
  //多个值,用数组或者是List集合
  private String []hobbys;
  public void setHobbys(String[] hobbys) {
    this.hobbys = hobbys;
  }
  public String single() {
    logger.info("获取的姓名为:"+name);
    if(hobbys!=null) {
      for (String hobby : hobbys) {
        logger.info("爱好有:"+hobby);
      }
    }
    return NONE;
  }
}


前端页面为:


<form action="simpleData" method="post">
    用户名:<input type="text" name="name"><br/>
    爱好: <input type="checkbox" name="hobbys" value="读书"> 读书
    <input type="checkbox" name="hobbys" value="编程"> 编程
    <input type="checkbox" name="hobbys" value="写小说">写小说<br/>
    <input type="submit" value="提交">
</form>


二.二.一.二 注意事项


其中前端的表单的name值要与Action中属性的值相同,并且还需要在Action中实现相应的setter方法,只有这样,才可以进行封装数据。


如果是单个值,用普通的基本类型进行封装(Struts2自动处理了包装类,所以建议用包装类进行接收。String–>String,int—>Integer. 这样当输入年龄的数字时,可以直接将age转换成数字了。不用Integer.parseInt(age)进行转换了)


如果是多个值,如多选框和多选的select框,那么需要用数组 String []hobbys或者 集合 List []hobbys进行相应的接收。


通过这种setter() 方法的封装,叫做属性驱动。


当前端属性数目小时,可以通过这种方式进行封装, 当属性数目过多时,如员工档案数据,有name,age,email,phone 等大量数据时,就不建议用这种方式了。


二.二.二 表达式封装Bean实体类对象


在一个表单里面,如果表单的元素值过多,如一个注册页面,要传递很多的属性数据,如果都写成setter方法,对每一个属性,单独进行封装,那么在Action中会有很多setter() 方法,导致Action 类 会很麻烦。我们希望Struts2可以直接将表单数据封装成Java Bean对象。


二.二.二.一 Demo 展示


先新建一个User.java对象,里面封装一些基本的属性


   /**
   * @param id 主键编号
   * @param name 姓名
   * @param sex 性别
   * @param age 年龄
   * @param relation 关系
   */
  private Integer id;
  private String name;
  private String sex;
  private Integer age;
  private String relation;
    //重写toString()方法,方便查看
    @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + ",     relation=" + relation + "]";
  }
  ...
    封装相应的setter 和 getter 方法。
  ...


在User.java 里面,提供封装setter和getter方法,重写toString()方法


新建UserAction类, 在里面封装User user 的属性,实现setter方法


/**
* @description 处理多个数据提交封装Java Bean的类
*/
public class UserAction extends ActionSupport{
  private static final long serialVersionUID = 5018178953781239408L;
  private Logger logger=Logger.getLogger(UserAction.class);
  private User user;
  public void setUser(User user) {
    this.user = user;
  }
  public User getUser() {
    return user;
  }
  public String setData() {
    logger.info("获取信息:"+user.toString());
    return NONE;
  }
}


前端form表单 /content/user.jsp


<body>
  <form action="Request_setData" method="post">
      姓名:<input type="text" name="user.name"><br/>
      性别:<input type="radio" name="user.sex" value="男">男
      <input type="radio" name="user.sex" value="女">女<br/>
      年龄:<input type="text" name="user.age"><br/>
      关系: <select name="user.relation">
          <option>父子</option>
          <option>母子</option>
          <option>姐弟</option>
          <option>妻弟</option>
        </select>
      <br/>
      <input type="submit" value="提交">
  </form>
</body>


运行Tomcat服务器,填写基本的数据后,控制台可以正常的打印前端输入的数据。


二.二.二.二 注意事项


1.实体类中属性值要与前端表单中的值相同(去除user.后),


2.UserAction中user 只是private User user,并没有将其实例化成private User user=new User(), Struts2会自动将其实例化。


3.input框中name=“对象.属性”, 这个对象指的是要将数据封装到哪个实体类对象。如果是private User a; 那么这个时候就是name=“a.name”


4.在Action中,必须要实现user的setter和getter()方法,只单独实现setter方法是不行的。


5.如果在Action中有 user 类和 teacher类,其中 user中有name属性,teacher 类也有name属性,那么 用 user.name 表达员工的姓名,teacher.name 表示教师的名称, 可以很方便的进行区分。


二.二.三 模型驱动封装 Java Bean对象。


需要Action 实现ModelDriven接口


二.二.三.一 ModelDriven 接口定义


public interface ModelDriven<T> {
    T getModel();
}


需要重写里面的 getModel() 方法。


二.二.三.二 Action实现


/
* @description 处理多个数据提交封装Java Bean的类
*/
public class UserAction2 extends ActionSupport
implements ModelDriven<User>{
  private static final long serialVersionUID = 5018178953781239408L;
  private Logger logger=Logger.getLogger(UserAction.class);
  // 需要直接实例化,不然会返回NPE 异常
  private User user=new User();
  @Override
  public User getModel() {
    return user;
  }
  public String setData() {
    logger.info("获取信息:"+user.toString());
    return NONE;
  }
}


前端时,/conent/user2.jsp


<form action="User2_setData" method="post">
  姓名:<input type="text" name="name"><br/>
  性别:<input type="radio" name="sex" value="男">男
  <input type="radio" name="sex" value="女">女<br/>
  年龄:<input type="text" name="age"><br/>
  关系: <select name="relation">
      <option>父子</option>
      <option>母子</option>
      <option>姐弟</option>
      <option>妻弟</option>
    </select>
  <br/>
  <input type="submit" value="提交">
</form>


重启服务器,输入数据,可以正常的接收到数据。

相关文章
|
1月前
|
前端开发 Java 数据库
SpringMVC的架构有什么优势?——表单和数据校验(四)
SpringMVC的架构有什么优势?——表单和数据校验(四)
|
1月前
|
中间件
使用 Express 框架开发数据爬取及展示接口
使用 Express 框架开发数据爬取及展示接口
46 0
|
7月前
|
数据处理
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
36 0
|
8月前
|
JSON fastjson Java
由浅入深C系列八:如何高效使用和处理Json格式的数据
本文简要介绍在c语言环境中使用cJSON处理JSON数据的方法,及提供相关示例代码。
|
10月前
|
数据采集 前端开发 JavaScript
Python爬虫实战:抽象包含Ajax动态内容的网页数据
Python爬虫实战:抽象包含Ajax动态内容的网页数据
|
10月前
|
JavaScript 前端开发 Java
SpringMVC 映射请求数据获取案例--模型数据
SpringMVC 映射请求数据获取案例--模型数据
66 0
|
11月前
|
JSON 前端开发 API
使用GraphQL优化前端数据获取
在现代前端开发中,数据获取是一个关键的环节。传统的REST API虽然简单易用,但在一些复杂的场景下可能会出现过度获取或不足获取数据的问题。为了解决这些问题,GraphQL应运而生。GraphQL是一种由Facebook开发的查询语言和运行时环境,它允许前端开发者明确指定需要的数据,并返回所需的精确数据,避免了传统REST API的缺陷。本文将深入探讨如何使用GraphQL优化前端数据获取,探讨GraphQL的优势以及如何在前端发起GraphQL查询。
|
XML JSON JavaScript
Web阶段:第十九章:JSON格式
Web阶段:第十九章:JSON格式
175 0
Web阶段:第十九章:JSON格式
|
XML 存储 JSON
Android网络与数据存储——网络编程数据处理(网络请求解析Json,解析xml)
Android网络与数据存储——网络编程数据处理(网络请求解析Json,解析xml)
240 0
|
前端开发 数据处理
SpringMVC 数据处理
1.前端接收参数 接受前端传递的参数实例
92 0
SpringMVC 数据处理