先有servlet
后有JSP。是为了方便。
在web.xml里面有:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
当我们访问jsp页面时间会自动调用,那个servlet,去编译。
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>development</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
Is Jasper usedin development mode? If true, -->
the frequency atwhich JSPs are checked for -->
modification may be specified via the -->
modificationTestInterval parameter.[true]
application= ServletContext
config = ServletConfig
page = this
request,response,out约等于 resoponse.getWrite();
还有三个:session,exception,pageContext.
一共九隐含对象。
Jsp可以与servlet一样用。
<servlet>
<servlet-name>xxx</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/myjsphtml</url-pattern>
</servlet-mapping>
前面已经总结过:
<%@ pagecontentType="text/html;charset=gb2312"%>
<%@ page pageEncoding=”GBK”%>
这两个单独存在的话,它们的作用是相同的,都是两个作用:
第一:按照这个编码生成Servlet文件。
第二:在servlet中生成一个setContentType()的方法,即告诉浏览器
用什么东西解码。
其实这两步是独立的,一步负责进去,一步负责出来。
如果这两个同时间存在,那么它们就各司其职,pageEncoding负责把它转换成Servelt以某种编码,contentType负责生成一个响应头方法去告诉浏览器我要以哪种编码发过去,请你用这个东西解码。
SetContentType(“GBK”)的作用,告诉浏览器我以GBK编码把数据送过去,请你用GBK解码,这就是浏览器能够自动选择编码的原因。
错误处理
<error-page>
<exception-type>java.lang.NullPointerExcepion</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/index.jsp</location>
</error-page>
配置错误页面:常用的是404和500两个错误码。
java.lang.NullPointerExcepion这样配置的错误就
太多了,你可以直接写上它的父类
java.lang.RunTimeExcepion
只有用<%@page
isErrorPage="true"
%>页面才能够有
<%=exception
%>否则无法获得这个隐含对象。
在正常页面用%@pageerrorPage="error.jsp" %引用它。
Cookie:
在IEà工具à隐私à高级把Cookie禁用后,那么就不能购物,不能够登陆邮箱 。
你每次发送请求,客户端之所以能够识别是因为它能够识别不同的cookie。
在JAVA中,我们调用 java.lang下面的包时间不用再导入这个包。
在jsp中,我们调用javax.servlet. java.servlet.http这些包也不用导入。
CoC
:
Cookie原理图,
在jsp页面:
<%
Cookiecookie = new Cookie("username","chen");
response.addCookie(cookie);
Cookiecookie2 = new Cookie("password","123");
response.addCookie(cookie2);
%>
然后去第一次访问这个页面,服务器会送出三个cookie.
Set-Cookie:JSESSIONID=5E751E38A3AB0062FB72248262DEA76E;Path=/day09_servlet_jsp
Set-Cookie: username=chen
Set-Cookie: password=123
一个是系统的,一个我们自己设置的,然后我们再去访问这个网站的其它页面的时间,
在客户端的响应消息头里面:
Cookie:username=chen;password=123;JSESSIONID=5E751E38A3AB0062FB72248262DEA76E
我们在购物或者只要是涉及到登陆名的网站甚至没有也行,那么服务器如果发现你没有他网站的cookie它都会给你发一个cookie,然后你在浏览器其它页面的时间,服务器才知道到底是谁在访问我,因为我们每个人发给浏览器的信息头都是一样的,唯一的区别是服务器发给我们的不同cookie.
我们可subcookiecookie.setPath("/");
Set-Cookie:JSESSIONID=769C8CB1BCD7823104F53E04BF1CC4A0;
Path=/day09_servlet_jsp
Set-Cookie:username=chen; Path=/
Set-Cookie:password=123
说明以后再向网页发出山请求的的时间,username,在任何时间都会发送给服务器,第一个 cookie只会在自己的网站下发送cookie而password只会对所在子目录下发送。
浏览器一关闭,内存就清空,cookie就不存在,如果你打开两个浏览器那么就是两个客户端。
惊天大秘密,我们在写servlet action时间打死你也不要用相对路径,一定要用绝对路径,
前面加上项目名/servlet_day05/servlet/login
,但是我们在部署的时间用户可能说我要改下访问路径,不想用这个名字,所以这样写,我们的jobsys项目在这做的特别不好,因为没有用绝对路径,很容易出问题。
<form
action="<%=request.getContextPath() %>/servlet/Login""method="post">
Request.setAttribute();
${}
<%=request.getAttribute(“username”)%>
这样用绝对有缺陷。
利用cookie记住登陆小例子十分重要:
第一、 action路径一定要用绝对路径,用request.getContextPath();
第二、 request.getRequestDispatcher().forwrad()
第三、 request.getCookies();
第四、 ${xx} = <%=request.getAttribute(xx)%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="<%=request.getContextPath() %>/servlet/Login"" method="post"> <input type="text" name="username" value="${userName}"/> <input type="password" name="password" value="${password}"/> <input type="checkbox" name="rememberMe" ${checked}/>记住我 <input type="submit" name="sub" value="login"/> </form> </body> </html>
package cn.cookie; import java.io.IOException; import java.io.PrintWriter; import java.net.CookiePolicy; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LogonUI extends HttpServlet { /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] cookies = request.getCookies(); String userName = null; String password = null; //这样写是怕第一次访问的时间肯定有空的值 。加个条件让它不进入循环,十分好。 for(int i=0;cookies!=null&&i<cookies.length;i++){ if ("username".equals(cookies[i].getName())) { userName = cookies[i].getValue(); } if("password".equals(cookies[i].getName())){ password = cookies[i].getValue(); } } request.setAttribute("userName", userName); request.setAttribute("password", password); String checked=""; if(userName !=null){ checked = "checked='checked'"; } request.setAttribute("checked", checked); RequestDispatcher rd = request.getRequestDispatcher("/autologon/login.jsp"); rd.forward(request, response); } }
package cn.cookie; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Login extends HttpServlet { /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); String remember = request.getParameter("rememberMe"); Cookie cookieUserName = new Cookie("username", null); Cookie cookiePassword = new Cookie("password", null); //只有当内容不为空的时间,才把它放到cookie里面去。 if (!"".equals(username) && !"".equals(password)) { cookieUserName.setValue(username); cookiePassword.setValue(password); //如果选中记住我,则把它年龄设置一年。 if (remember!=null) { cookiePassword.setMaxAge(365*24*3600); cookieUserName.setMaxAge(365*24*3600); } } response.addCookie(cookieUserName); response.addCookie(cookiePassword); request.getRequestDispatcher("/autologon/success.jsp").forward(request, response); } }