JSP(Java Server Pages)的BUG之旅

Java Server Pages

    • 前言
    • 注意事项
    • request.getParameter("name")错误
    • request.getParameter()和request.getAttribute()区别
    • getRequestDispatcher()
    • 汉字乱码错误
    • 汉字转码时遇见的编译错误
    • Classes from the default package must not be referenced from JSP file错误
    • tomcat启动时出现了Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]等错误
    • 配置好web.xml的servlet服务后,JSP页面显示源代码
      • 解决办法一
      • 解决办法二(莽就完事了)
    • Servlet与jsp页面配置时拼写错误(The requested resource is not available.)
    • 七种数据库中SELECT TOP的使用方法,不同数据库要使用不用select top

前言

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

注意事项

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!
JSP(Java Server Pages)的BUG之旅_第1张图片
因为不是html文件所以不能使用浏览器直接编译展示,需要配置在服务端。

request.getParameter(“name”)错误

括号内应该使用name属性,id属性会出错。

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

Servlet中Request的getAttribute getParameter 区别

  • 从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。 request.getParameter()方法返回String类型的数据。
    request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件(下文转发介绍)之间共享。这两个方法能够设置Object类型的共享数据。
    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.

getRequestDispatcher()

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

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

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

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

无论是请求转发还是请求包含,都在一个请求范围内!使用同一个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

汉字乱码错误

因为请求到达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编码的文本,都以bytes[]的形式保存,若要显示中文,只需以显示平台的默认编码格式进行解码即可。若仍然以ISO-8859-1格式解码,得到的中文字符肯定是乱码,因为ISO-8859-1自身不能显示中文。

//注意:需要转为字节型才可以,因为规定如此
    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]]等错误

JSP(Java Server Pages)的BUG之旅_第2张图片

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

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

    <servlet>
        <servlet-name>SearchStudentServletservlet-name>
        <servlet-class>StudentBao.SearchStudentServletservlet-class>
    servlet>
    <servlet-mapping>
    <servlet-name>SearchStudentServletservlet-name>
    <url-pattern>/searchStudenturl-pattern>
servlet-mapping>

解决办法一

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

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

name属性

    <servlet>
        <servlet-name>SearchStudentServletservlet-name>
        <servlet-class>StudentBao.SearchStudentServletservlet-class>
    servlet>

urlPatterns属性

    <servlet-mapping>
    <servlet-name>SearchStudentServletservlet-name>
    <url-pattern>/searchStudenturl-pattern>
servlet-mapping>

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

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

将标签** 可能版本升级servlet标签可以使用@WebServlet代替更加方便,于是就忽视了老版本。
JSP(Java Server Pages)的BUG之旅_第3张图片

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

JSP(Java Server Pages)的BUG之旅_第4张图片

JSP(Java Server Pages)的BUG之旅_第5张图片
BUT!!!,配置的时候我用了大写L
还有配置的时候LoginServlet(map的键)已经对应http://localhost:8080/工程名/(map的值),所以使用的时候直接用LoginServlet就行了。
后续:
其实是配置的时候把servlet-name和mapping中配置url-pattern名字不一样,导致资源查找不到。

JSP(Java Server Pages)的BUG之旅_第6张图片

七种数据库中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  

你可能感兴趣的:(javaweb笔记,jsp,java,tomcat,web,servlet)