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

  • 中文问题

    • 修改addProductjsp
    • 修改strutsxml
    • 修改showjsp
  • 开启日志功能
    • 故意制造一个struts的配置错误
    • 在src目录下增加log4jxml
    • 关闭log4jxml日志输出
  • Struts获取request对象和response对象
  • Struts获取session对象
    • 在ProductAction的add方法中访问Session
    • 在showjsp中把通过EL表达式把session中的数据取出来
    • 测试
  • Struts上传文件
    • 准备 uploadjsp
    • 创建UploadAction类
    • 配置strutsxml
    • 创建successjsp
    • 测试

中文问题

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()方法中进行文件复制即可

Struts学习笔记--(二)Struts基础相关推荐

  1. Struts 2 的学习笔记(二) struts的配置流程和strut是2的工作原理

    2019独角兽企业重金招聘Python工程师标准>>> 配置及流程 1.       Web.xml中配置 <!-- struts2的核心过滤器  前端控制器 作用:接管请求. ...

  2. JS学习笔记二——JavaScript 基础知识

    JavaScript 基础知识 一.JavaScript 变量 二.JavaScript 的输出 三.JavaScript 运算符 四.结语 一.JavaScript 变量 变量是指在程序运行过程中, ...

  3. 数字图像处理学习笔记 二 数字图像基础

    目录 一 .人类视觉成像 二.数字图像处理的基本概念和操作 三.数学工具介绍 一 .人类视觉成像 1.眼睛上两类光感受器:锥状体和杆状体 锥状体: 数量在600-700万之间,主要位于视网膜的中间部分 ...

  4. HTML5学习笔记二 HTML基础

    一.HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. <h1>标题一</h1> <h2>标题二& ...

  5. java冰法_Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /*这是 * 一段注释, * 它跨越了多个行*/ public void ...

  6. JAVA高并发学习笔记(二) 多线程基础

    1.1什么是线程 线程是进程(程序在计算机上的一次执行活动)内的执行单元 进程是以独立于其他进程的方式运行的,进程间是互相隔离的.一个进程无法直接访问另一个进程的数据.进程的资源诸如内存和CPU时间片 ...

  7. Struts学习笔记总结

    Struts学习笔记总结 一.Struts是由Apache开源联盟提供的一套用于构建 Java web应用程序的框架,它的目标是希望分离Web程序的表示层.控制层和模型层,即MVC框架,使程序员将更多 ...

  8. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  9. 前端学习笔记之CSS3基础语法与盒模型(二)

    前端学习笔记之 CSS3基础语法与盒模型 CSS3简介 CSS(cascading style sheet,层叠式样式表)是用来给HTML标签添加样式的语言 CSS3是CSS的最新版本,增加了大量的样 ...

  10. Golang学习笔记之GORM基础使用(二)

    本文章主要学习GORM的增删查改.若还没有完成数据库和数据表的创建.定义模型以及数据库的连接请先学习本本专栏文章Golang学习笔记之GORM基础使用(一).本文为学习笔记,通过GORM官方中文文档和 ...

最新文章

  1. 008_多配置文件的引入
  2. Leet Code OJ 169. Majority Element [Difficulty: Easy]
  3. Ubuntu中设置环境变量PATH
  4. AJAX:校验用户名是否被注册
  5. MySQL JDBC URL各参数详解
  6. 190. 颠倒二进制位
  7. linux 常用命令02--文件属性 以及软硬链接
  8. Snap svg 主要对象
  9. 怎么抓取屏幕截图计算机考试时间,定时抓屏快照(电脑截屏工具)V4.8 最新版
  10. 论文浅尝 | EARL: Joint Entity and Relation Linking for QA over KG
  11. python3openpyxl,python3和openpyxl,在写入fi时格式化日期列表
  12. Docker加入白名单
  13. 剑指offer面试题28. 对称的二叉树(递归)
  14. MUI APP关于页面之间的传值,plusready和自定义事件
  15. Flash Player不支持火狐_谷歌浏览器
  16. 52 个有用的机器学习与预测接口盘点
  17. 如何一站式高效管理固定资产?
  18. HTTPS原理,三分钟轻松搞懂
  19. 使用 TestFlight 进行 iOS App 内测
  20. 信息网络安全模拟题----软考高项的走过来

热门文章

  1. 帮忙投票被 是大学生投票活动 投第五个 谢谢啦
  2. 多维度雷达图怎么做_数据可视化:柱状图、雷达图等六种基本图表的特点和适用场合...
  3. 周二补丁日(Patch Tuesday)
  4. 1、Java中“并发编程”详解【voliate、synchronized、JMM内存模型、原子类操作Atomic..、CAS原理】
  5. 关注微信公众号二维码可以带参数吗?
  6. HTML与CSS实战
  7. 知乎学了python_你们都是怎么学 Python 的?
  8. Android:异步处理之Handler+Thread 入门应用
  9. 基于树型弱分类器的adaboot演示(含Matlab代码)
  10. 杂谈3G的方方面面及其必然之失败[参考]