JSP(Java Server Pages)的BUG之旅

前言

本文借鉴多位大佬博客经验所得,进行总结方便日后使用,侵权必删。
关于转发
关于request的传值

标签中name和id属性的区别

- name常用于form表单

在网页做Post提交时,是以Form(即表单域)为单位进行提交的,一个Form里有若干个表单对象(如),同一个页面里可以为多个Form(Asp.net不同,它只允许有一个,且名字必须为Form1),在表单表提交到服务器端后,可以直接通过Name属性取到表单域的值,却无法通过ID直接取到该表表单对象的值。

另外,同一个Form里不能有多个name属性相同的HTML标记,但如果一个网页中有多个Form,则不同的Form里可以有同个Name属性的标记。而ID是全局的,在一个HTML文档里不能有多个节点使用相同的ID,无论它处在哪个Form里。

- id常用于设置css样式

在建立CSS样式的时候,可以建立ID样式表(以#为前缀),使具有该ID的样式直接应用该样式,而无法建立Name样式表。

使用Javascript进行Dom节点定位时建议使用getElementById方法,因为只有ID能唯一标识一个节点,而同一个网页里可能会有多个Name属性相同的节点,它们分别处在不同的Form里。

注意事项

JSP是servlet程序,会被编译成.class文件和serlet程序类似需要配置在服务器端,不能和html文件一样直接使用浏览器打开,需要先启动tomcat服务器才能使用浏览器打开,但是效果看似和html一样,但是可以处理数据等。
感觉像前后端的冗杂。

否则会出现

There is no configured/running web-servers found! Please, run any web-configuration and hit the Refresh button!
在这里插入图片描述
因为不是html文件所以不能使用浏览器直接编译展示,需要配置在服务端。

request.getParameter(“name”)错误

括号内应该使用name属性,id属性会出错。
含有name属性的标签才会被用于传递信息。

request.getParameter()和request.getAttribute()区别

Servlet中Request的getAttribute getParameter 区别

  • 从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。 request.getParameter()方法返回String类型的数据。
    request.setAttribute()和getAttribute()方法传递的数据只会存在于具有转发关系的Web组件(下文转发介绍)之间共享。这两个方法能够设置Object类型的共享数据。(注意:jsp和servlet无转发关系)
    request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据。

    request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
    getAttribute是返回对象,getParameter返回字符串

    总的来说:request.getAttribute()方法返回request范围内存在的对象,而 request.getParameter()方法是获取http提交过来的数据。

  • request is something that comes from the user, attributes come from the session

  • Use request.getParameter() when user are planning to fetch values
    from a html/jsp page, and use requets.getAttribute() when user want
    to fetch attribute values which are set using request.setAttribute()
    IN A SERVLET.
    request.setAttribute多用于servlet服务端之间或者与jsp进行信息传递

getRequestDispatcher()

getRequestDispatcher()包含两个方法,分别是请求转发和请求包含。

RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");

请求转发: rd.forward( request , response );
请求包含: rd.include( request , response);
一个请求跨多个Servlet,需要使用转发和包含。

请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
请求包含:由两个Servlet共同完成响应体!(留头又留体)

无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!因为方法中forward( request , response )传递的就是同一个request和response

  • 请求转发和重定向的区别:

请求转发是一个请求一次响应,而重定向是两次请求两次响应。
请求转发地址不变化,而重定向会显示后一个请求的地址
请求转发只能转发到本项目其它Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目
请求转发是服务端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,既包含项目名!

  • request域

同一个请求范围内使用request.setAttribute()和request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,转发到后一个Servlet调用getAttribute()获取值;

  • jsp和servlet联系

    Tomcat 服务器会帮我们把 jsp 页面翻译成为一个 java 源文件。并且对它进行编译成为.class 字节码程序。
    我们跟踪原代码发现,HttpJspBase 类。它直接地继承了 HttpServlet 类。也就是说。jsp 翻译出来的 java 类,它间接了继承了 HttpServlet 类。也就是说,翻译出来的是一个 Servlet 程序

    所以使用转发操作可以使两个jsp页面共享同一个request和response
    并且
    request的作用域范围不能通过.forward( request , response )进行验证,因为这样转发请求无数次request也能用,只能用getParameter进行表单提交验证作用域范围,因为getAttribute只能依赖.forward( request , response )才有用。

汉字乱码错误

信息编码部分
因为请求到达JSP文件(继承了HttpServlet)的时候,服务器是对于接收到的汉字默认使用ISO-8859-1编码(汉字->ISO-8859-1),传回客户端(在网页显示出来的时候UTF-8解码(将ISO-8859-1编码的汉字用UTF-8方式解码肯定乱了))的时候需要将IOS编码的bytes数组改为UTF-8编码,因为不同编码对应的汉字不同。
GB2312和UTF-8也不能混用

  • 注意配置的编码方式需要和网页显示汉字的解码方式一致。

  • 从本质上说,ISO-8859-1是单字节编码,自身不能显示中文(一个汉字占两个字节),若要显示中文,必须和其他能显示中文的编码配合,如“GBK”,“UTF-8",

    以ISO-8859-1编码的文本,都以byte[ ]数组(单字节变量byte)的形式保存,若要显示中文,只需以显示平台的默认编码格式进行解码即可。若仍然以ISO-8859-1格式解码,得到的中文字符肯定是乱码,因为ISO-8859-1自身不能显示中文。

//后台乱码原因:tomcat服务器默认使用ISO编解码,但是ISO无法显示汉字,所以导致乱码。
//前端乱码原因:tomcat默认使用ISO编码,但是前端使用UTF-8解码所以乱码。
//所以都需要转为UTF-8编码类型。
//注意:需要转为字节型才可以,因为ISO是单字节编解码。
//转化为byte类型之后,先通过IOS解码,然后再重新使用UTF-8编码,显示的汉字就不是乱码了。
    c=new String(c.getBytes("ISO-8859-1"),"UTF-8");
    //这里规定必须使用String类型
    URLEncoder.encode("中国.jpg","UTF-8");

汉字转码时遇见的编译错误

    String c=request.getParameter("sex");
    //进行汉字转码时,对应的标签内容不能为空,否则编译错误
    c=new String(c.getBytes("ISO-8859-1"),"UTF-8");
    out.println(c);

Classes from the default package must not be referenced from JSP file错误

默认包下的Java类无法被JSP文件所引用,因此可以新建一个包,将报错的Java类添加进该包当中,之后使用 <%@ page import=“包名.类名” %> 进行导包。
注意一定要新建包然后放入类才行。

tomcat启动时出现了Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]等错误

在这里插入图片描述

配置好web.xml的servlet服务后,JSP页面显示源代码

错误原因:
个人猜测:可能JSP和servlet同属于服务器操作,进行web配置的时候会出现冲突,导致都无法使用。
版本更新操作导致的疏忽。

    <servlet>
        <servlet-name>SearchStudentServlet</servlet-name>
        <servlet-class>StudentBao.SearchStudentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>SearchStudentServlet</servlet-name>
    <url-pattern>/searchStudent</url-pattern>
</servlet-mapping>

解决办法一

直接把web.xml端的servlet代码注释掉,JSP页面立马恢复正常。
webServlet
name为起别名的标签
urlPatterns为配置访问触发标签
可以和原始标签功能一一对应

//放在import语句下面
@WebServlet(name="SearchStudent",urlPatterns = "/searchStudent",loadOnStartup = 1)

name属性

    <servlet>
        <servlet-name>SearchStudentServlet</servlet-name>
        <servlet-class>StudentBao.SearchStudentServlet</servlet-class>
    </servlet>

urlPatterns属性

    <servlet-mapping>
    <servlet-name>SearchStudentServlet</servlet-name>
    <url-pattern>/searchStudent</url-pattern>
</servlet-mapping>

loadOnStartup对应注册中的 加载顺序,只能填大于0的整数
,数字越小越先加载。

解决办法二(莽就完事了)

将标签**<web-app**后面的代码全给删了,servlet标签就能正常用了。
可能版本升级servlet标签可以使用@WebServlet代替更加方便,于是就忽视了老版本。
在这里插入图片描述

Servlet与jsp页面配置时拼写错误(The requested resource is not available.)

在这里插入图片描述

在这里插入图片描述
BUT!!!,配置的时候我用了大写L
还有配置的时候LoginServlet(map的键)已经对应http://localhost:8080/工程名/(map的值),所以使用的时候直接用LoginServlet就行了。
后续:
其实是配置的时候把servlet-name和mapping中配置url-pattern名字不一样,导致资源查找不到。

在这里插入图片描述

七种数据库中SELECT TOP的使用方法,不同数据库要使用不用select top

1. Oracle数据库  

SELECT * FROM TABLENAME WHERE ROWNUM <= N  

2. Infomix数据库  

SELECT FIRST N * FROM TABLENAME  

3. DB2数据库  

SELECT *  

FROM (SELECT * ROW_NUMBER() OVER({ORDER BY COL1 DESC}) AS ROWNUM FROM TABLENAME)  

WHERE ROWNUM <= N  

或者  

SELECT COLUMN FROM TABLENAME FETCH FIRST N ROWS ONLY  

4. SQL Server数据库  

SELECT TOP N * FROM TABLENAME  

5. Sybase数据库  

SET ROWCOUNT N  

GO  

SELECT * FROM TABLENAME  

6. MySQL数据库  

SELECT * FROM TABLENAME LIMIT N  

7. FoxPro数据库  

SELECT * TOP N FROM TABLENAME ORDER BY COLUMN  
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值