(注:本文用途:只是用于自己个人的学习。
本文内容:本人学习时遇到的一些问题的收集,所以一般是网上找的解决的方案。
写本文的原因:收藏的时候,有些博主可能会把发布的删除这就。。。所以以这种形式保存下来)
**
(一)JSP 使用报Duplicate local variable path 错误以及解决方法
**
错误提示:
Multiple annotations found at this line:
- Duplicate local variable path
- Duplicate local variable
basePath
重复变量,
因为<%@include%>引进的是代码,把代码包含进来,而新进JSP时,会默认生成
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"😕/"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
这二句代码,所以用<%@include%>引进页面是就报重复变量 basePath
解决方法,把要引进页面这句去掉就行,
建议页面无逻辑代码可用jsp:include/这个引入的是结果,就是引进页面编译后的结果,适用于纯html页面
**
(二)启动tomcat时console中报错
**
报如下错:(只截取了部分)严重: ContainerBase.addChild: start: (只截取了部分,具体得还得自己看报错的原因,但是网上找到的,和自己错误的原因都是web.xml配置的错误)
具体可以看一下,这个示例
**
(三)关于图形验证码
**
(最好还是弄清楚关键部分原理,下面贴上源代码)
例:设计登录程序,要求登录时输入图形验证码,假设正确的用户名和密码是张三和123。演示地址:http://localhost:8080/ch10_1/Login.jsp)
1.这个是登录部分的代码(login.jsp)
<%@ page pageEncoding="UTF-8"%>
<html>
<head>
<title>带图形验证码的登录</title>
</head>
<body>
<form method="post" name="form1">
用户名
<input type="text" name="userid" />
<br />
密码
<input type="password" name="userpwd" value="${param.userpwd }" />
<br />
验证码
<input type="text" name="checkcode" />
<!--切忌依葫芦画瓢。注意:此处的路径(src)是Servlet(checkCode)在web.xml文件中配置的路径,不然你就一定会生不成图片。-->
<img border="0" src="checkcode" onclick="form1.checking.src='checkcode?aaa='+Math.random()"/>
<input type="submit" value="换一张"
onclick="form1.checking.src='checkcode?aaa='+Math.random()" />
<br />
<input type="submit" value="登录" onclick="form1.action='logcheck'" />
<input type="reset" value="重置" />
<div id="mes">
${info}
</div>
</form>
</body>
</html>
2.这个是生成验证码的Servlet(checkCode)
package Servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class checkCode extends HttpServlet {
public checkCode() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
HttpSession session = request.getSession();
int width = 60;
int height = 20;
// 设置浏览器不要缓存此图片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 创建内存图像并获得其图形上下文
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 产生随机验证码
// 定义验证码的字符表
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] rands = new char[4];
for (int i = 0; i < 4; i++) {
int rand = (int) (Math.random() * 36);
rands[i] = chars.charAt(rand);
}
// 产生图像
// 画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
// 随机产生120个干扰点
for (int i = 0; i < 120; i++) {
int x = (int) (Math.random() * width);
int y = (int) (Math.random() * height);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue));
g.drawOval(x, y, 1, 0);
}
g.setColor(Color.BLACK);
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
// 在不同的高度上输出验证码的不同字符
g.drawString("" + rands[0], 1, 17);
g.drawString("" + rands[1], 16, 15);
g.drawString("" + rands[2], 31, 18);
g.drawString("" + rands[3], 46, 16);
g.dispose();
// 将图像输出到客户端
ServletOutputStream sos = response.getOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", baos);
byte[] buffer = baos.toByteArray();
response.setContentLength(buffer.length);
sos.write(buffer);
baos.close();
sos.close();
// 将验证码放到 session 中
session.setAttribute("checkCode", new String(rands));
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
public void init() throws ServletException {
// Put your code here
}
}
3.这个是登录检查的的servlet(logCheck)
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LogCheck extends HttpServlet {
public LogCheck() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String userid = request.getParameter("userid");
String userpwd = request.getParameter("userpwd");
String usercheckcode = request.getParameter("checkcode");
String info = "";
HttpSession session = request.getSession();
String servercheckcode = (String) session.getAttribute("checkCode");
if (!servercheckcode.equalsIgnoreCase(usercheckcode)) {
info = "验证码不正确,请重新输入";
} else if ("张三".equals(userid) && "123".equals(userpwd)) {
info = "登录成功";
} else {
info = "用户名或密码不正确";
}
request.setAttribute("info", info);
RequestDispatcher rd = request.getRequestDispatcher("/Login.jsp");
rd.forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void init() throws ServletException {
// Put your code here
}
}
**
(四)JSP 规范要求一个属性名字前有空格
**

如图:红圆圈处缺少一个空格,加上就好了。
(五)myeclipse怎么显示隐藏文件夹
(功能窗都可以这样打开,有时候苦于不认识英文)

(加入mysql驱动的时候,需要构建路径,可能点击右键之后,没有看见build path。
那。。。)
Windows–ShowView->Other,搜索package explorer,使用这个透视图就可以了。
这个时候点击右键包就会显示出来。
(6)
Stacktrace:
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:481)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:470)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
报错原因:
实体类定义的属性首写字母写了大写。命名不规范引起的
解决办法:
修改实体类的字段名就好了
(7)
用Myeclipse开发java web程序,写javabean的时候,如果字段很多的话,写get和set方法是一件很无语和浪费时间的事情,所以Myeclipse提供了一个自动生成这些方法的功能。
首先新建一个javabean Student.java,字段有sno,sname,age等。如下:
public class Student {
private String sno;
private String sname;
private int age;
}
保存后,右键Student.java,选择source->GenerateSetter and Getter…这一项,选择selectAll选中所有的字段,确定后,即生成了所有字段的get和set方法,十分方便,节省了很多时间。


(8)java.sql.SQLException: Before start of result set异常及处理办法
异常:java.sql.SQLException: Before start of result set
解决方法:使用rs.getString();前一定要加上rs.next();
原因:ResultSet对象代表SQL语句执行的结果集,维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next()应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。在ResultSe对象及其t父辈Statement对象关闭之前,光标一直保持有效。
**
(9)字符串和数字之间的转换
**
(这个老是忘,我。。。可能领悟不够深吧)
string 和int之间的转换
string转换成int :Integer.valueOf(“12”)
int转换成string : String.valueOf(12)
**
(10)Java获取最后插入MySQL记录的自增ID值的3种方法
**
添加链接描述
(11) myeclipse中JSTL标签库没有生效,,(在已经导入了JSTLjar包的情况下)
运行时的报错信息:cvc-complex-type.2.4.a: Invalid content was found starting with element ‘display-name’. One of ‘{“http://java.sun.com/xml/ns/j2ee”:servlet-class, “http://java.sun.com/xml/ns/ j2ee”:jsp-file}’ is expected
解决方法:
- 修改WEB.XML 版本号为2.4
- 在表头设置参数isELIgnored=“false”
<%@ page contentType=“text/html; charset=gb2312” language=“java” isELIgnored=“false” %>
<%@ page isELIgnored="true|false"%>
如果设定为真,那么JSP中的表达式被当成字符串处理。
比如下面这个表达式:
KaTeX parse error: Expected '}', got 'EOF' at end of input: …ored="true"时输出为{2000 % 20},而isELIgnored="false"时输出为100。Web容器默认isELIgnored="false"。
但是我的运行的时候仍然出错了,不过至少JSTL标签库语言生效了。如果没记错的话,是在web.xml文件中报错。(报的什么错我给忘了,因为大家可能有相同的问题,具体可以看这个,链接)
**
(12)
**
报错如下:You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ‘describe,status) values(null,‘葱?..?è??’,‘1’,’???¤???€???°’,‘0’)’ at line 1
(对于这个问题,我真真是查了好久。。。只能说自己没学好,不然不会犯这种错误。)
//这句代码基本功不扎实的乍一看好像是没什么问题,然而还是有问题的
insert into goods(id,name,price,describe,status) values(?,?,?,?,?)
出错原因:name、describe、status 都是sql语句中的关键字,是不能以这些关键字命名的。
解决方法:可以将代码改成如下
insert into goods(id,gname,gprice,gdescribe,gstatus) values(?,?,?,?,?)
PS :下次遇到这种sql语句有问题的情况可以先去mysql中运行一遍,成功了以后,在写入servlet中
(13)用COS组件上传文件
(有借鉴的部分,但是为了易于理解,我将其他博主的得代码进行改善一下,因为我自己目前并不需要那些的功能。然后我根据自己多方面的查找资料进行了各句代码的解释)
如下:
首先要把cos组件放到WebRoot/WEB-INF/lib文件夹下
接下来给一些代码的实例:
1.(upload.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload2" method="post" enctype="multipart/form-data">
<input type="file" name="file1" contenteditable="false" οnclick="info.innerHTML=''"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
2.(upload2.jsp)
package util;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
public class upload2 extends HttpServlet {
public upload2() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String saveDirectory = this.getServletContext().getRealPath("")
+ "\\upload";//这个文件上传的位置是在tomcat服务器ch10_3这个项目的upload文件中
File savedir = new File(saveDirectory);//把这个文路径下的文件命名为savedir
if (!savedir.exists()) {//如果文件该路径文件不存在,就创建这个文件夹
savedir.mkdirs();
}
int maxPostSize = 3 * 5 * 1024 * 1024; // 总上传大小限制:15M
//第一个参数(request)为传过来的请求HttpServletRequest,
//第二个参数( saveDirectory)为上传文件要存储在服务器端的目录名称
//第三个参数(maxPostSize)是用来限制用户上传文件大小
//第四个参数("utf-8")可以设定用何种编码方式来上传文件名称,可以解决中文问题
MultipartRequest multi = new MultipartRequest(request, saveDirectory,maxPostSize, "utf-8");//定义用于获得文件和表单其他信息的类 MultipartReques类主要是对文件上传进行的处理
//FileRenamePolicy policy =(FileRenamePolicy)new DefaultFileRenamePolicy();//重命名的政策自动为新文件重新命名。没加这句也就是:重名会默认覆盖原文件
//2.要获得上传文件和表单其他元素信息,2这一块的代码主要是:在console下输出文件的名,上传路径的信息。
Enumeration<String> files = multi.getFileNames();
while(files.hasMoreElements()){
String name = files.nextElement();
File f = multi.getFile(name);
if (f != null) {
String fileName1 = f.getName();
//String filePath = f.getAbsolutePath();//获得文件上传路径
System.out.println(fileName1); //输出文件名fileName1=fileName,获取方式不同
String fileName=multi.getFilesystemName(name);
String lastFileName=saveDirectory+"\\"+fileName;
System.out.println("上传文件:"+lastFileName); //输出的是文件上传到的地址
}
}
//3.传回所有文件输入类型的名称。执行下面的语句后,我们上传的文件就会命名为:更改成功.jpg。到时候可以到 saveDirectory路径下去查看是否更改成功
Enumeration efs = multi.getFileNames();
while(efs.hasMoreElements()){
File file = multi.getFile(efs.nextElement().toString());
if(file.exists()){
String fileName="更改成功.jpg";
String newPath=saveDirectory+"\\"+fileName;
File newfile = new File(newPath);
file.renameTo(newfile);
System.out.println("上传成功! ");
}
} request.getRequestDispatcher("upload1.jsp").forward(request,
response);
}
public void init() throws ServletException {
// Put your code here
}
}
上面的代码还是不能实现我的功能,因为我想用request.getParameters("???")这个方法获取表单参数的时候,获得的参数为空。为此。。。郁闷了一下。后来百度一下
这个是我找到的比较好懂一点的
**
(14)servlet报错“严重: Allocate exception for servlet 类名java.lang.ClassNotFoundException: 路径. 类名”可能原因…
**
我运行时的确有报这个错,但是跟这个博主的原因相近,但也不完全一样.(我的servlet不知道为什么变成了文件夹,而不是包。)总而言之,言而总之,就是路径错了,可以跟着这个思路去修改文件的配置
1.WEB-INF下web.xml中路径错误,正确路径为
<servlet-class>包名.类名</servlet-class>
**
(15)这个问题,可见12,因为有点相似
**
问题如下:
严重: Servlet.service() for servlet [jsp] threw exception javax.el.ELException:
原因:JSP新建的变量名和JAVA关键字重复
解决办法:更改即可
(16)附上一个关于Ajax使用的实例(代码中有注释)

1.ajax.js
//ajax的声明方法和发送客户请求的方法
var httpRequest=null;//声明XMLHttpRequeat对象
function createXHR(){
if(window.XMLHttpRequest){ //针对Mozilla,Safari,Opera,IE7等浏览器创建
httpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject){
try{
httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); //针对IE7新版本创建
}catch(e){
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");//IE较老版本
}catch(e){
httpRequest = null;
}
}
}
if(!httpRequest){
alert("fail to create httpRequest");
}
}
function sendRequest(url,params,method,handler){
createXHR();
if(!httpRequest) return false;
httpRequest.onreadystatechange = handler;
if(method == "GET"){
httpRequest.open(method,url+ '?' + params,true);
httpRequest.send(null);
}
if(method == "POST"){
httpRequest.open(method,url,true);
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
httpRequest.send(params);
}
}
2.select.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="text/javascript" src="js/ajax.js"></script>
<script type="text/javascript">
function refresh(){
var p=document.getElementById("prov").value; //得到请选择省份栏的值
var city=document.getElementById("city");//得到所选的城市名
if(p==""){
city.options.length=0;
city.options.add(new Option("--请选择城市--"))
}
else{
var url="list";//所要跳转到servlet的地址
var params="proc="+p ;//传递过去的参数
sendRequest(url,params,'POST',show);
}
}
function show(){
var city=document.getElementById("city");
if (httpRequest.readyState == 4) { //完成状态:数据全部接收完成
if (httpRequest.status == 200) {//一切顺利
var citylist=httpRequest.responseText.split(",");//responseText属性;服务器返回的请求响应文本,将传回的信息当字符串使用
//处理字符串的函数:JavaScript split() 方法(具体的自己去查)这个plit(",")相当于原句输出
var citynum=citylist.length;
city.options.length=0;
for(i=0;i<citynum;i++)
city.options.add(new Option(citylist[i]))
}
}
}
</script>
</head>
<body>
<select name="prov" id="prov" onchange="refresh();">
<option value="">--请选择省份--</option>
<option value="山东">山东</option>
<option value="江苏">江苏</option>
<option value="广东">广东</option>
</select>
<select name="city" id="city">
<option>--请选择城市--</option>
</select>
</body>
</html>
3.List.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class List extends HttpServlet {
public List() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map<String, String> pm = new HashMap<String, String>();
pm.put("山东", "济南,青岛,泰安,潍坊,烟台,聊城,枣庄,菏泽,莱芜,临沂");
pm.put("江苏", "南京,苏州,无锡,徐州,南通,连云港,镇江,常州,淮安,扬州");
pm.put("广东", "广州,深圳,珠海,汕头,佛山,东莞,湛江,江门,中山,惠州");
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String s1 = request.getParameter("proc");//得到你所选择的城市
out.print(pm.get(s1));///服务器在返回给客户端数据的时候用的是out.print();
}
public void init() throws ServletException {
}
}
接下来,第二个例子:

**1.**ajax.js和上例相同
**2.**form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>表单验证</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="js/ajax.js"></script>
<script type="text/javascript">
//如果有值不方便传递,可以用全局能量
function formcheck(){
var url="formcheck";
var userid=document.getElementById("userid").value;
var userpwd=document.getElementById("userpwd").value;
var params="userid="+userid+"&userpwd="+userpwd;
sendRequest(url,params,'POST',showresult);
}
function showresult(){
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
var info=httpRequest.responseText;
document.getElementById("result").innerHTML=info;//这个可以将ID为“result”的标签值改成ifo
}
}
}
</script>
</head>
<body>
请输入用户名:<input type="text" name="userid" id="userid" onblur="formcheck()"/><br/>
请输入密码 :<input type="password" name="userpwd" id="userpwd"/><br/>
<input type="button" value="登录" onclick="formcheck()"/>
<div id="result"></div>
</body>
</html>
**3.**FormCheck.java
package servlers;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormCheck extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("UTF-8");
String userid=request.getParameter("userid");
if(!"张三".equals(userid)){
out.print("用户名不存在");
//服务器在返回给客户端数据的时候用的是out.print();
}
else{
String userpwd=request.getParameter("userpwd");
if(!"".equals(userpwd)){
if("123".equals(userpwd)){
out.print("欢迎您");
}else{
out.print("密码错误");
}
}
}
}
}
(17)Multiple annotations found at this line: - Syntax error, insert “}” to complete
看一下JSP页面中的JavaScript代码,是不是少了大括号什么的。
**
servlet中获取系统时间,并去除毫秒
**
首先,导入必要的包(否则会报错)
/引入Timestamp
import java.sql.Timestamp;
//引入DateFormat
import java.text.*;
然后在代码中写,如下代码
//获取当前系统时间
Timestamp date=new Timestamp(System.currentTimeMillis());
//定义格式,不显示毫秒
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//将当前系统时间转换为不显示毫秒情况,保存为string类型在dateNow中
String dateNow= df.format(date);
//显示系统时间
System.out.println("系统时间:"+dateNow);
**
19JavaScript字符串转换成数字的三种方法
**
这个是在用了某位网友告诉我的用alert(“显示”+orderNum+myOp+“数量”+newCount+“价格”+goodsPrice); 如下为我调试发现错误的说明:
var s = document.getElementById(orderNum).innerHTML; //根据物品的序号得到物品的数量 ,得到的S值应该是1
newCount = x + 1;//这样变成字符串的连接
alert("显示数量"+newCount);
//在显示时候,就是:显示数量11,但是其实我是想1+1=2
这种方式去调试JS代码,虽然我也不知道是不是最好调试办法,毕竟我还没学。但是他还是有用,我发现了我获得数据是字符串而不是数字。好吧,接下来说字符串转换成数字的方法。
1. 转换函数:
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。
一些示例如下:
代码如下:
parseInt(“1234blue”); //returns 1234
parseInt(“0xA”); //returns 10
parseInt(“22.5”); //returns 22
parseInt(“blue”); //returns NaN
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,示例如下:
代码如下:
parseInt(“AF”, 16); //returns 175
parseInt(“10”, 2); //returns 2
parseInt(“10”, 8); //returns 8
parseInt(“10”, 10); //returns 10
如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
代码如下:
parseInt(“010”); //returns 8
parseInt(“010”, 8); //returns 8
parseInt(“010”, 10); //returns 10
parseFloat()方法与parseInt()方法的处理方式相似。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,parseFloat()没有基模式。
下面是使用parseFloat()方法的示例:
代码如下:
parseFloat(“1234blue”); //returns 1234.0
parseFloat(“0xA”); //returns NaN
parseFloat(“22.5”); //returns 22.5
parseFloat(“22.34.5”); //returns 22.34
parseFloat(“0908”); //returns 908
parseFloat(“blue”); //returns NaN
2. 强制类型转换
还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
可以用下面的代码段测试Boolean型的强制类型转换。
代码如下:
Boolean(""); //false – empty string
Boolean(“hi”); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(null); //false - null
Boolean(0); //false - zero
Boolean(new Object()); //true – object
Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。
示例如下:
代码如下:
| 用法 | 结果 |
|---|---|
| Number(false) | 0 |
| Number(true) | 1 |
| Number(undefined) | NaN |
| Number(null) | 0 |
| Number( "5.5 ") | 5.5 |
| Number( "56 ") | 56 |
| Number( "5.6.7 ") | NaN |
| Number(new Object()) | NaN |
| Number(100) | 100 |
最后一种强制类型转换方法String()是最简单的,
示例如下:
代码如下:
var s1 = String(null); //“null”
var oNull = null;
var s2 = oNull.toString(); //won’t work, causes an error
3. 利用js变量弱类型转换
复制代码 代码如下:
上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换,不过这个方法还是不推荐的
作业可能快要学完了,我想说JS还有html其实不了解。然后学习我们在一直路上。
本文汇总了解决JSP和Servlet开发过程中遇到的常见问题,包括Duplicatelocalvariable错误、图形验证码实现、JSTL标签库配置、文件上传、SQL语法错误修正等,提供详尽的代码示例和解决步骤。
3万+





