struts数据类型转化(Double.parseDouble())(values[0].split)(string centerValues[])(properties)

本文详细介绍了Struts2框架在Web应用中的配置方式,包括web.xml和struts.xml文件的设置,以及如何通过这些配置实现动态网页的开发。同时,展示了一个简单的CircleAction案例,说明了如何利用Struts2进行页面跳转和数据传递。
(font color="#333333")(s:submit value="submit")

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	
  <display-name>StrutsTutorial</display-name>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.i18n.encoding" value="utf-8"></constant>
	
    <!-- 引入默认文件(可能就是以前这里没有引入,所以错误啦) -->
    <include file="struts-default.xml"></include>
    
	<package name="convert" namespace="/convert" extends="struts-default">
		<action name="circle" class="com.CircleAction">
			<result name="success">/circleMessage.jsp</result>
		</action>
	</package>
</struts>


circleMessage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
	<body>
		<s:property value="message"/>
	</body>
</html>


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
  </head>
  
  <body>
    <s:form action="convert/circle.action" method="post">
    	<table align="center" border="0" width="400">
    		<tr>
    			<td colspan="2"><font color="#3737de"></font>
    		</tr>
    		<tr>
    			<td><input type="text" name="circle"/></td>
    			<td><font color="red">x,y,radius</font></td>
    		</tr>
    		<tr>
    			<td colspan="3" align="center"><s:submit value="submit"></s:submit></td>
    		</tr>
    	</table>
    </s:form>
  </body>
</html>


Point.java

package com;

public class Point 
{
	private double x;
	private double y;
	public double getX() {
		return x;
	}
	public void setX(double x) {
		this.x = x;
	}
	public double getY() {
		return y;
	}
	public void setY(double y) {
		this.y = y;
	}
	
}


Circle.java

package com;

public class Circle 
{
	private Double radius;
	private Point center;
	public Double getRadius() {
		return radius;
	}
	public void setRadius(Double radius) {
		this.radius = radius;
	}
	public Point getCenter() {
		return center;
	}
	public void setCenter(Point center) {
		this.center = center;
	}
	
}


CircleAction.java

package com;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class CircleAction extends ActionSupport
{
	private Circle circle;
	@Override
	public String execute() throws Exception
	{
		double c=2*3.14*circle.getRadius();
		double s=3.14*circle.getRadius()*circle.getRadius();
		
		ActionContext.getContext().put("message", 
				circle.getCenter().getX()+","+circle.getCenter().getY());
		return SUCCESS;
	}
	public Circle getCircle() {
		return circle;
	}
	public void setCircle(Circle circle) {
		this.circle = circle;
	}
	
}

CircleConvert.java

package com;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

public class CircleConverter extends StrutsTypeConverter 
{
@Override
	public Object convertFromString(Map context,String[] values,Class toClass)
	{
		Circle circle=new Circle();
		Point center=new Point();
		String centerValues[]=values[0].split(",");
		double x=Double.parseDouble(centerValues[0]);
		double y=Double.parseDouble(centerValues[1]);
		center.setX(x);center.setY(y);
		circle.setRadius(Double.parseDouble(centerValues[2]));
		circle.setCenter(center);
		return circle;
	}
@Override
	public String convertToString(Map context,Object value)
	{
		Circle circle=(Circle)value;
		return circle.toString();
	}
}


CircleAction-conversion.propertiesCircleAction-conversion.propertiesCircleAction-conversion.propertiesCircleAction-conversion.properties


circle=com.CircleConverter

 


 

<think>好的,我现在要处理用户提供的这段代码中的潜在问题。用户给出的代码是: double real = Double.parseDouble(actualValue); double rmsMax = Double.parseDouble(maxValue); 首先,我需要理解这段代码的作用。看起来用户是在将两个字符串变量actualValue和maxValue转换为double类型的数值。但根据之前的对话历史,用户之前遇到了NumberFormatException,因为尝试解析空字符串。所以现在的问题是,这段代码是否有同样的问题,以及如何避免。 接下来,我需要考虑可能引发异常的情况。如果actualValue或maxValue是null、空字符串,或者包含非数字字符(比如字母、符号等),Double.parseDouble()就会抛出NumberFormatException。例如,如果actualValue是"",或者像"abc",那么转换就会失败。 用户可能是在从请求参数、表单输入、文件读取或数据库获取这些字符串值。因此,这些值的来源可能存在不可控的情况,导致无效的输入。比如,前端表单提交时用户没有填写某个字段,或者传参时遗漏了值,这时候后端接收到空字符串,解析时就会出错。 接下来,我需要思考解决方案。根据之前的建议,用户已经了解了一些方法,比如输入验证、异常处理和工具方法。现在需要针对这段具体的代码,给出具体的改进措施。 首先,输入验证是必要的。在调用parseDouble之前,应该检查字符串是否有效。可以使用Apache Commons Lang的StringUtils.isNotBlank,或者Java自带的String.isEmpty()String.isBlank()(Java 11+)。例如: if (StringUtils.isNotBlank(actualValue)) { double real = Double.parseDouble(actualValue); } else { // 处理空值的情况,比如设置默认值或抛出异常 } 但用户可能需要更详细的指导,比如如何处理无效值,是否设置默认值,或者记录错误日志。 其次,异常处理也是需要考虑的。即使进行了初步的验证,仍然有可能出现其他格式错误,比如字符串包含非数字字符。因此,使用try-catch块来捕获NumberFormatException,可以提供更健壮的错误处理。 try { double real = Double.parseDouble(actualValue); } catch (NumberFormatException e) { // 处理异常,如记录日志或返回错误信息 } 不过,过多的try-catch可能会让代码显得冗长,特别是如果有多个parseDouble调用。这时候可以考虑封装一个工具方法,如之前提到的safeParseDouble,返回Optional或默认值。 另外,用户可能在使用Spring框架,所以可以建议使用Spring的注解进行参数验证,比如@RequestParam结合@NotNull或@Min等,或者在DTO中使用验证注解,配合@Validated来触发校验。这样可以减少手动检查的代码量。 例如: public class MyRequest { @NotNull @DecimalMin("0.0") private String actualValue; // getters and setters } 然后在控制器方法中使用@Valid来触发验证: @PostMapping("/path") public ResponseEntity<?> handleRequest(@Valid @RequestBody MyRequest request) { // 处理逻辑 } 这样,如果actualValue为空或不符合要求,Spring会自动返回错误响应,而不需要手动解析。 除此之外,前端验证也是一个重要的环节,确保用户输入的是有效的数字,并且必填字段不为空。例如,使用HTML5的input类型为number,并添加required属性。 用户可能需要了解如何综合使用这些方法,特别是在现有的代码结构中如何修改。比如,如果代码是在处理HTTP请求参数,可能需要添加@RequestParam的required属性,或者设置默认值。 另外,日志记录也是调试和排查问题的重要工具。在解析之前或捕获异常时,记录相关变量的值,可以帮助快速定位问题来源。 现在,我需要将这些思考整理成一个结构化的回答,涵盖潜在风险、解决方案、代码示例以及预防措施。同时,需要确保语言清晰,步骤明确,帮助用户逐步解决问题。可能还需要提醒用户注意空字符串和null的区别,比如如果变量可能为null,需要先检查null,再检查空字符串。 最后,需要检查是否有遗漏的情况,比如字符串中包含空格(如" 123 "),这时候trim()方法可能会有帮助。或者像“NaN”、“Infinity”这样的特殊字符串,虽然Double.parseDouble可以处理它们,但可能需要特别处理,视业务需求而定。</think>--- ### **代码风险分析** 您提供的代码存在以下潜在风险: ```java double real = Double.parseDouble(actualValue); double rmsMax = Double.parseDouble(maxValue); ``` **主要风险点**: 1. **空字符串**:若`actualValue`或`maxValue`为`""`,直接触发`NumberFormatException` 2. **null值**:输入为`null`时引发`NullPointerException` 3. **非法字符**:包含非数字字符(如`"12.3a"`)导致解析失败 4. **空白字符**:类似`" 123 "`含空格的值可能意外通过验证但解析失败 --- ### **解决方案与代码改进** #### 1. 防御性验证(基础方案) ```java // 验证非空且可解析 if (actualValue != null && !actualValue.trim().isEmpty()) { try { double real = Double.parseDouble(actualValue.trim()); } catch (NumberFormatException e) { logger.error("无效数值: actualValue={}", actualValue); // 设置默认值或抛出业务异常 } } else { logger.warn("空数值参数: actualValue"); } // 同理处理maxValue ``` #### 2. 工具类封装(推荐方案) ```java public class NumberParser { // 安全解析方法(支持默认值) public static double parseDoubleSafe(String value, double defaultValue) { if (value == null || value.trim().isEmpty()) { return defaultValue; } try { return Double.parseDouble(value.trim()); } catch (NumberFormatException e) { return defaultValue; } } // 带异常抛出版本 public static double parseDoubleStrict(String value) { if (value == null) throw new IllegalArgumentException("输入值不能为null"); String trimmed = value.trim(); if (trimmed.isEmpty()) throw new IllegalArgumentException("输入值不能为空字符串"); return Double.parseDouble(trimmed); } } // 使用示例 double real = NumberParser.parseDoubleSafe(actualValue, 0.0); double rmsMax = NumberParser.parseDoubleStrict(maxValue); // 严格模式 ``` #### 3. Spring框架集成方案 ```java // 步骤1:定义验证DTO public class MeasurementRequest { @NotBlank(message = "实际值不能为空") @Pattern(regexp = "^[+-]?\\d+(\\.\\d+)?$", message = "必须是有效数字") private String actualValue; @DecimalMin(value = "0.0", inclusive = false, message = "最大值必须大于0") private String maxValue; // getters/setters } // 步骤2:控制器中使用验证 @PostMapping("/measure") public ResponseEntity<?> processMeasurement( @Valid @RequestBody MeasurementRequest request) { // 自动触发验证 double real = Double.parseDouble(request.getActualValue()); double rmsMax = Double.parseDouble(request.getMaxValue()); // 业务逻辑处理 } ``` --- ### **异常处理建议** #### 层级处理策略 | 处理层级 | 实现方式 | 优点 | |---------|---------|------| | 前端验证 | HTML5约束验证/JS验证 | 即时反馈 | | 控制器验证 | `@Valid`注解+BindingResult | 请求级别控制 | | 全局异常处理 | `@ControllerAdvice` | 统一错误格式 | | 最终防御 | try-catch块 | 兜底保护 | **全局异常处理器示例**: ```java @ControllerAdvice public class ApiExceptionHandler { @ExceptionHandler(NumberFormatException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorResponse handleNumberFormatException(NumberFormatException ex) { return new ErrorResponse("DATA_CONVERSION_ERROR", "数值格式错误: " + ex.getMessage()); } } ``` --- ### **调试技巧** 1. **日志增强**: ```java logger.debug("原始输入值 - actualValue: [{}], maxValue: [{}]", actualValue, maxValue); // 使用[]包裹显示空白字符 ``` 2. **单元测试用例**: ```java @Test void testParseDoubleEdgeCases() { assertThrows(IllegalArgumentException.class, () -> NumberParser.parseDoubleStrict("")); assertEquals(0.0, NumberParser.parseDoubleSafe(null, 0.0)); assertEquals(123.45, NumberParser.parseDoubleSafe(" 123.45 ", 0.0)); } ``` 3. **IDE调试配置**: - 在`parseDouble`调用处设置条件断点: ``` Condition: actualValue == null || actualValue.trim().isEmpty() ``` - 启用"Show toString()"选项查看字符串实际内容 --- ### **关联知识扩展** 1. **数值解析优化**: - 使用`java.text.NumberFormat`处理本地化格式: ```java NumberFormat format = NumberFormat.getInstance(Locale.US); Number number = format.parse("1,234.56"); double value = number.doubleValue(); ``` 2. **BigDecimal精度控制**: ```java new BigDecimal("123.456").setScale(2, RoundingMode.HALF_UP); ``` 3. **Apache Commons工具**: ```java NumberUtils.toDouble("123.4", 0.0); // 无需try-catch NumberUtils.isParsable("12x3"); // 返回false ``` --- 通过以上改进方案,可以显著提升代码的健壮性。建议根据具体业务场景选择: - **严格模式**:对核心业务参数使用`parseDoubleStrict` - **宽容模式**:对可选参数使用`parseDoubleSafe` - **框架整合**:在Spring项目中优先使用注解验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值