Java Server Pages
- 前言
- 标签中name和id属性的区别
- 注意事项
- 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的传值
标签中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