zoukankan      html  css  js  c++  java
  • 框架学习之Struts2 第三节 请求参数的接收和自定义类型转换器

    1. 接受请求参数

    这里的参数可以是get方式提交的,也可以是post方式提交的

    有两种方式:第一种方式,采用基本类型接收请求参数

    原理是struts2采用了反射技术给action类的属性赋值

    第二种方式,采用复合类型接收参数。

    其内部是采用了反射技术,首先如果相应的类的对象为null,就调用默认的无参的构造方法生成一个实例,然后给实例的属性赋值

     12_1

    测试一:以get方式提交

    在上节测试代码中的strutspackage.xml的名为yinger的package中添加以下的action

    <action name="requestPara" class="com.yinger.HelloWorld"
    method
    ="requestPara">
    <result name="requestPara">/requestPara.jsp</result>
    </action>
    Person.java


    package com.beans;

    public class Person {

    private String id;
    private String name;

    public String getId() {
    return id;
    }
    public void setId(String id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }

    }
    在HelloWorld中添加以下内容:

    private String requestPara;
    private Person onePerson;

    public String plaintext(){
    message
    = "HelloWorld.plaintext";
    return "plaintext";
    }

    public String requestPara(){
    message
    = "HelloWorld.requestPara";
    return "requestPara";
    }

    public String getRequestPara() {
    return requestPara;
    }
    添加 requestPara.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>My JSP 'requestPara.jsp' starting page</title>
    </head>

    <body>
    requestPara.jsp
    <br>
    requestPara:${requestPara }
    <br>
    person.id:${onePerson.id }
    <br>
    person.name:${onePerson.name }
    <br>
    </body>
    </html>

    测试结果:

    1.http://localhost:8080/struts2test/yinger/requestPara?requestPara=yinger

    11

    2.http://localhost:8080/struts2test/yinger/requestPara?onePerson.id=2

    12

    3.http://localhost:8080/struts2test/yinger/requestPara?onePerson.name=yinger

    13

    4.http://localhost:8080/struts2test/yinger/requestPara?onePerson.id=2&onePerson.name=yinger

    14

      

    测试二:使用post方式

    Person.java添加以下内容

    private Date birthday;

    public Date getBirthday() {
    return birthday;
    }
    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }
      
    修改 index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>My JSP 'index.jsp' starting page</title>
    </head>

    <body>
    <s:form method="post" action="requestPost" namespace="/yinger">
    name:
    <br><input name="onePerson.name" /><br>
    id:
    <br><input name="onePerson.id" /><br>

    <input type="submit" name="submit" value="提交" /><br>
    </s:form>
    </body>
    </html>
    同样的,在刚才的action下面添加新的action

    <action name="requestPost" class="com.yinger.HelloWorld"
    method
    ="requestPost">
    <result name="requestPost">/requestPara.jsp</result>
    </action>

       

    测试结果:

    编辑,点提交

     

    结果视图:

    2. 解决struts2.1.6 中接收中文请求的参数乱码的问题的方法

    没有测试过!

    这里有一个很好的解释和代码展示:http://www.iteye.com/topic/483158

    以前学习JavaWeb时还学过一个方法:修改 Tomcat的配置文件 server.xml 

        <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" 

          redirectPort="8443" URIEncoding="UTF-8" />  

    在这里设置了编码方式就可以防止请求参数中文乱码的问题,但是有一个缺点就是它会作用于所有的web应用,修改了这个配置就会影响其他的应用

    如果都是同一种编码方式那也没有问题,呵呵呵呵

    12_2

    3. struts2提供了两种类型转换器

    ①全局类型转换器

    ②局部类型转换器

    13_1

    局部类型转换器:ActionName-conversion.properties

    13_2

    导入包时: 两者选择哪个都可以,视频老师说是测试过了,我是用的上者,注意他们要重写的方法是不同的,并且建议你使用上者,我两个都试了试,呵呵

    17

    全局类型转换器:xwork-conversion.properties

    14_1

    测试代码:

    修改index.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>My JSP 'reuqestPara.jsp' starting page</title>
    </head>

    <body>
    requestPara.jsp
    <br>
    time:{time}
    <br>
    person.id:${onePerson.id }
    <br>
    person.name:${onePerson.name }
    <br>
    person.birthday:${onePerson.birthday }
    <br>
    </body>
    </html>  
    类型转换类


    package com.convertion;

    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;

    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

    public class DateConvertion extends DefaultTypeConverter{

    //这个convertValue是双向的,既有从页面得到请求的参数,转换成后台的的对应的类型
    //也有从后台将处理的结果显示在前台,之前进行另外一次转型,转成String
    @SuppressWarnings("rawtypes")
    @Override
    public Object convertValue(Map<String, Object> context, Object value,
    Class toType) {
    SimpleDateFormat sdf
    =new SimpleDateFormat("yyyyMMdd");
    try {
    if(toType==Date.class){//String-->Date
    String[] paras=(String[])value;//value=Request.getParameterValues()
    return sdf.parse(paras[0]);
    }
    else if(toType==String.class){//Date-->String
    Date date=(Date)value;
    return sdf.format(date);
    }
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

    }
      
    在com.yinger 包下面添加 属性文件

    文件名:HelloWorld-conversion.properties

    文件内容:
    onePerson.birthday=com.convertion.DateConvertion
    time=com.convertion.DateConvertion

       

    测试结果:

    1. 首先不添加那个属性文件,测试index.jsp,正确解析了Date   birthday

    1819

    2.测试index.jsp,格式为 yyyyMMdd 的解析错误

    20

    21

    3.测试requestPara这个action,格式正确解析正确  time

    22

    4.格式为 yyyyMMdd的解析错误  time

    23

    5. 添加了 properties 这件之后! time,正确

    24

    测试 index.jsp  解析正确

    2526

      

    4. 访问和添加 request / session / application 属性

    可以 通过 ActionContext 来访问,得到的不是对象,而是一个相应的map

    15_1

    获取 HttpServletRequest  /  HttpServletSession  / HttpServletResponse / ServletContext 对象

    有两种方法:第一种方法,通过 ServletActionContext 直接获取

    它可以得到对应的各种对象,但是大多数时候并不需要得到对应的对象,因为多数时候都只是set和get对应的对象的属性值

    第二种方法,实现指定的接口,具体的什么时候执行类中的方法是由struts框架来决定的,它会在运行时注入相关的信息

    15_2

    测试代码:

    HelloWorld中添加方法

    public String scope() {
    ActionContext ctx
    = ActionContext.getContext();
    ctx.getApplication().put(
    "app", "application范围");// 往ServletContext里放入app
    ctx.getSession().put("ses", "session范围");// 往session里放入ses
    ctx.put("req", "request范围");// 往request里放入req
    return "scope";

    }
      
    添加新的action

    <action name="scope" class="com.yinger.HelloWorld"
    method
    ="scope">
    <result name="scope">/scope.jsp</result>
    </action>  
    新的jsp:scope.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>My JSP 'scope.jsp' starting page</title>
    </head>

    <body>
    application:${applicationScope.app }
    <br>
    session:${sessionScope.ses }
    <br>
    request:${requestScope.req }
    <br>
    </body>
    </html>

      

    测试结果:

  • 相关阅读:
    ASCII,Unicode,UTF
    C#值类型和引用类型2
    C#中使用Foreach
    CSS基础(2)
    CSS基础
    HTML基础
    MySQL高级
    MySQL和Python交互案例练习(2)
    MySQL和Python交互案例练习(1)
    外键SQL语句的编写
  • 原文地址:https://www.cnblogs.com/yinger/p/2116977.html
Copyright © 2011-2022 走看看