Struts学习笔记--(二)Struts基础

本文为how2java Struts教程的学习笔记,原教程链接如下:http://how2j.cn/k/struts/struts-jsp/55.html

中文问题

Struts的中文问题,由3部分组成

  1. jsp提交数据的时候,必须是UTF-8编码的
  2. struts拿到数据后进行UTF-8解码
  3. 服务端跳转到jsp进行显示的时候,要指定浏览器使用UTF-8进行显示

UTF-8可以换成GBK或者GB2312,但是必须统一,不能混用 。
总结来说就是在JSP和Struts.xml中设置编码解码格式为UTF-8

修改addProduct.jsp

提交数据的时候指定编码方式UTF-8,并且设置form 的method为post方式。因为默认的get方式限制Form表单的数据集的值必须为ASCII字符(也就是说不能有中文);而Post支持整个ISO10646字符集,默认是用ISO-8859-1编码。

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>

<html>
<form action="addProduct" method="post">
   <input type="text" name="product.name">
   <br/>
   <input type="submit" value="submit">
</form>
</html>

修改struts.xml

指定解码方式为UTF-8

<struts>
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>

  <package name="basicstruts" extends="struts-default">
    ...
  </package>

</struts>

修改show.jsp

服务端跳转到jsp进行显示的时候,要指定浏览器使用UTF-8进行显示

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>

${product.name}

修改完成后即可正确处理中文。

开启日志功能

在tomcat启动struts web应用的时候,如果出现了struts配置上的错误,你可能只能看到一个 Error FilterStart的提示,而看不到详细的错误原因。 这样就加大了定位和解决问题的难度 。这是因为默认配置下,struts把日志输出关闭了 。为了把日志输出开启便于调试,需要增加log4j.xml这个配置文件。

故意制造一个struts的配置错误

在struts.xml中故意把一个ProductAction写成ProductAction1。这样struts就会启动失败,虽然启动失败了,但是tomcat给出的错误信息非常有限,很不利于调试。 无法知道到底哪里写错了。

在src目录下增加log4j.xml

在src目录下增加log4j.xml,打开日志功能

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
       <layout class="org.apache.log4j.PatternLayout"> 
          <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> 
       </layout> 
    </appender>

    <!-- specify the logging level for loggers from other libraries -->
    <logger name="com.opensymphony">
        <level value="DEBUG" />
    </logger>

    <logger name="org.apache.struts2">
         <level value="DEBUG" />
    </logger>

   <!-- for all other loggers log only debug and above log messages -->
     <root>
        <priority value="INFO"/> 
        <appender-ref ref="STDOUT" /> 
     </root> 

</log4j:configuration> 

然后重新启动tomcat即可看到具体struts启动失败错误原因。如图所示,可以看到很明确的错误原因,ProductAction1类的ClassNotFoundException:

这里写图片描述

关闭log4j.xml日志输出

有了log4j.xml日志输出可以帮助调试,但是也会导致struts的启动变慢。关闭log4j.xml日志输出很简单,直接把log4j.xml命名成其他文件即可,以后要用再把名字改回来,很方便。

Struts获取request对象和response对象

修改ProductAction的show()方法,通过ServletActionContext.getRequest()ServletActionContext.getResponse()来获取request和response对象。(此时项目需要添加对servlet-api.jar、struts2-core-2.2.1.jar和xwork-core-2.2.1.jar的依赖)

public String show() {
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();

    System.out.println("request:\t" + request);
    System.out.println("response:\t" + response);

    product = new Product();
    product.setName("iphone7");
    return "show";
}

运行结果:

这里写图片描述

在Tomcat的控制台输出,可以看到Struts使用类StrutsRequestWrapper对HttpServletRequest进行了封装。

Struts获取session对象

struts中的Session有两个:

  • 传统的servlet包下的HttpSession:通过ServletActionContext.getRequest().getSession(); 获取。
  • Struts中自己定义的Session:这个session以Map的形式出现,其中的值和HttpSession中的值是同步的。通过Map m = ActionContext.getContext().getSession(); 获取。

在ProductAction的add方法中访问Session

在add方法中获取Struts定义的Session,然后把 name放进去。

public String add() {
    Map m = ActionContext.getContext().getSession();
    m.put("name", product.getName());
    return "show";
}

通过Httpsession可以达到一样的效果:

public String add(){
    HttpSession session = ServletActionContext.getRequest().getSession();
    session.setAttribute("name",product.getName());
    return "show";
}  

在show.jsp中把通过EL表达式把session中的数据取出来

EL表达式可以直接从session中把数据取出来

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" isELIgnored="false"%>
${product.name}
</br>
${name}

测试

通过http://localhost:8080/addProduct.jsp增加数据,在show.jsp中就可以看到session中的name:

这里写图片描述

Struts上传文件

准备 upload.jsp

上传一定要为form加上enctype=”multipart/form-data”,表示提交的数据时二进制的.并且必须是method=”post”

使用struts的s:file标签标识上传文件框

<s:file name="doc" label="upload" />

这里name使用doc会和服务端的相应代码匹配

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<body>

<form action="upload" method="post" enctype="multipart/form-data">

  上传文件 : <input type="file" name="doc" /> <br> 
  <input type="submit" value="上传">
</form>

</body>
</html>

创建UploadAction类

package com.how2java.action;

public class UploadAction {

    File doc;
    String docFileName;
    String docContentType;

    public File getDoc() {
        return doc;
    }

    public void setDoc(File doc) {
        this.doc = doc;
    }

    public String getDocFileName() {
        return docFileName;
    }

    public void setDocFileName(String docFileName) {
        this.docFileName = docFileName;
    }

    public String getDocContentType() {
        return docContentType;
    }

    public void setDocContentType(String docContentType) {
        this.docContentType = docContentType;
    }

    public String upload() {
        System.out.println(doc);
        System.out.println(docFileName);
        System.out.println(docContentType);
        return "success";
    }
}

在upload.jsp中file字段对应的name是”doc”,所以在action中,必须准备3个属性,分别是

  • File doc;
  • String docFileName;
  • String docContentType;

属性名字不能使用其他的,必须基于“doc”。然后为这3个属性提供getter和setter。

配置struts.xml

为upload路径配置UploadAction,并返回success.jsp:

...
<action name="upload" class="com.how2java.action.UploadAction" method="upload">
    <result name="success">success.jsp</result>
</action> 
...

可以设置上传文件的最大值:如下设置上传文件最大大小为10m

<struts>
  <constant name="struts.multipart.maxSize" value="10240000"/>

  <package name="basicstruts" extends="struts-default">   
    ...
  </package>

</struts>

创建success.jsp

分别显示doc,docFileName,docContentType:

<%@page isELIgnored="false"%>
uploaded success
<br/> 
${doc}
<br/>
${docFileName}
<br/>
${docContentType}
<br/>

测试

重启tomcat,访问页面,进行文件上传提交:http://localhost:8080/upload.jsp
提交后显示如下页面:(出现问号因为success.jsp没设置编码UTF-8)

这里写图片描述

  • 第一行表示上传后被放在tomcat的work目录下,并且以.tmp命名
  • 第二行表示上传文件本来的名字
  • 第三行表示上传文件的mime type

上传的tmp临时文件在upload()方法结束后就被删除掉如果想把tmp临时文件保存到某个指定目录下,在upload()方法中进行文件复制即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值