本文借鉴多位大佬博客经验所得,进行总结方便日后使用,侵权必删。
关于转发
关于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!
因为不是html文件所以不能使用浏览器直接编译展示,需要配置在服务端。
括号内应该使用name属性,id属性会出错。
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()包含两个方法,分别是请求转发和请求包含。
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
请求转发: rd.forward( request , response );
请求包含: rd.include( request , response);
一个请求跨多个Servlet,需要使用转发和包含。
请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
请求包含:由两个Servlet共同完成响应体!(留头又留体)
无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!
请求转发是一个请求一次响应,而重定向是两次请求两次响应。
请求转发地址不变化,而重定向会显示后一个请求的地址
请求转发只能转发到本项目其它Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目
请求转发是服务端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,既包含项目名!
同一个请求范围内使用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);
默认包下的Java类无法被JSP文件所引用,因此可以新建一个包,将报错的Java类添加进该包当中,之后使用 <%@ page import=“包名.类名” %> 进行导包。
注意一定要新建包然后放入类才行。
错误原因:
个人猜测:可能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的整数
,数字越小越先加载。
将标签**
BUT!!!,配置的时候我用了大写L
还有配置的时候LoginServlet(map的键)已经对应http://localhost:8080/工程名/(map的值),所以使用的时候直接用LoginServlet就行了。
后续:
其实是配置的时候把servlet-name和mapping中配置url-pattern名字不一样,导致资源查找不到。
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