写JavaWeb作业时遇到的问题

本文汇总了解决JSP和Servlet开发过程中遇到的常见问题,包括Duplicatelocalvariable错误、图形验证码实现、JSTL标签库配置、文件上传、SQL语法错误修正等,提供详尽的代码示例和解决步骤。

(注:本文用途:只是用于自己个人的学习。
本文内容:本人学习时遇到的一些问题的收集,所以一般是网上找的解决的方案。
写本文的原因:收藏的时候,有些博主可能会把发布的删除这就。。。所以以这种形式保存下来)
**

(一)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
解决方法:

  1. 修改WEB.XML 版本号为2.4

  1. 在表头设置参数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其实不了解。然后学习我们在一直路上。

### Java Web 期末大作业系统常见问题及解决方法 在开发基于 Java Web 的期末大作业系统,可能会遇到多种技术挑战和常见问题。以下是这些问题及其对应的解决方案: #### 数据库连接异常处理 数据库连接失败是一个常见的问题,通常由于配置错误或网络问题引起。可以通过以下方式解决问题:确保 JDBC 驱动已正确加载并匹配所使用的数据库版本[^1];验证 `url`、`username` 和 `password` 是否正确设置;检查服务器端口是否开放以及防火墙规则。 ```java try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mydatabase", "root", "password" ); } catch (SQLException | ClassNotFoundException e) { System.err.println(e.getMessage()); } ``` #### 表单提交数据乱码 表单提交的数据可能出现中文字符乱码的情况。这通常是编码不一致引起的。可以在 Servlet 中强制指定请求和响应的编码格式为 UTF-8 来避免此问题[^2]。 ```java request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ``` #### 文件上传功能实现困难 文件上传涉及多部分表单解析逻辑复杂度较高。可以借助 Apache Commons FileUpload 库简化操作流程[^3]。 ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> ``` ```java DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { if (!item.isFormField()) { String fileName = FilenameUtils.getName(item.getName()); item.write(new File("/path/to/uploads/" + fileName)); } } ``` #### 用户会话管理不当 如果未妥善管理用户的登录状态,则可能导致安全性漏洞或者用户体验不佳的现象发生。建议采用 HttpSession 对象存储用户信息,并通过过滤器机制保护敏感资源访问权限。 ```java HttpSession session = request.getSession(); session.setAttribute("user", userObject); // Filter example if (session.getAttribute("user") == null) { response.sendRedirect("login.jsp"); return; } ``` #### 页面跳转与重定向混乱 页面之间相互调用关系错综复杂容易造成循环依赖等问题。应该合理规划 URL 路径结构设计RESTful风格API接口减少不必要的内部转发次数提高程序可维护性和扩展性[^2]. ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值