1:request对象
是从客户端向服务器端发出请求,包括用户提交的信息以及客户端的一些信息。request对象是javax.servlet.http.HttpServletRequest类的实现实例。
request对象封装了浏览器的请求信息,通过request对象的各种方法可以获取客户端以及用户提交的各项请求信息。
使用request对象获取客户端提交的请求参数的常用方法如下:
1.String getParameter(String name),获取上一页面所提交的参数值的参数值,并以字符串形式返回指定参数的值,如果参数不存在则返回空值。用于表单、链接或网址栏传递参数时,使用此方法。
例如,获取客户端name的参数值:
String name = request.getParameter("name");
2.String[ ] getParameterValues(String name),获取以相同名称命名的表单组件提交的数据,主要用于获取复选框的值,返回值类型是字符串数组String[ ]
例如,获取客户端hobby复选框的所有取值:
String[ ] hobbys = request.getParameterValues("hobby");
3.void setCharacterEncoding(String encoding),设置字符编码方式,用来解决传递非英文字符所出现的乱码问题。
对于以post提交的表单数据
在第一行写:
request.setCharacterEncoding("UTF-8");
对于以get提交的表单数据
提交的数据作为查询字符串被附加到URL 的末端发送到服务器,此时字服务器端调用
setCharacterEncoding()方法就没有作用了,我们需要得到请求参数值之后,进行编码转换
String name=request.getParameter("name");
name=new String(name.getBytes("ISO-8859-1"),"UTF-8");
也可以通过TomCat目录下的conf下的server.xml文件,在<Connector>元素中添加URIEncoding 属性,将它的值设置为“utf-8”
<Connector
port="8080"
protocol="HTTP/1.1"
reidrectPort="8433"
URIEncoding ="UTF-8"
/>
4.RequestDispatcher getRequestDispatcher(String path)----获取请求分配器
返回一个javax.servlet.RequestDispatcher对象该方法的forward()方法用于 转发请求
例如,request.setCharacterEncoding("UTF-8");
实例:使用request对象实现用户注册功能
zhuce.html源代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
</html>
zhuce.jsp源代码如下:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=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>
</html>
void sentRedirect(String location);重新定位到新的URL
getRequestDispatcher()与sendRedirect()的区别
1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ;
response.sendRedirect()是重新定向,前后页面不是一个request。
2.RequestDispatcher.forward()是在服务器端运行;
HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成.
3.ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径; 而
ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为
ServletRequest具有相对路径的概念;而ServletContext对象无此概念。
RequestDispatcher对象从客户端获取请求request,并把它们传递给服务器上的servlet,html或
jsp。它有两个方法:
2.void include(ServletRequest request,ServletResponse response)
用来记录保留request和response,以后不能再修改response里表示状态的信息。
二者区别:
response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参
数,如:
url?id=1.
request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求
能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而
sendRedirect()会新建request对象,所以上一个request中的数据会丢失。
更具体来说就是这样的:
redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后
服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的.
forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的响应. 这时页面
收到的request不是从浏览器直接发来了,可能己经用request.setAttribute在request里放了数据.在转到的页
面可直接用request.getAttribute获得数据。
Session
text/plain:
设置临时文件存放的目录
HttpServlet类之所以是一个抽象类就是因为它有个抽象方法 service()
GenericServlet类实现了 javax.servlet.Servlet 和的 javax.servlet.ServletConfig 接口。 GenericServlet类可以由一个servlet可以直接延长,虽然它的扩展协议特定的子类更常见,如HttpServlet。
GenericServlet类使得编写servlet更加容易。它提供的生命周期方法的简单版本的init和破坏,并在ServletConfig接口的方法。 GenericServlet类也实现了日志的方法,在ServletContext接口中声明。
要编写一个通用的servlet,你只需要重写抽象的服务方法。
一:在本章我们将学到如下的内容
》HTTP协议原理
》服务器端Web编程原理
》Servlet与Web容器
》Java Web应用程序的组成
》Tomcat介绍
一:1.1解析HTTP协议
HTTP:超文本传输协议(HyperText Transfer Protocol)
HTTP是一种无状态的协议,意思是指在Web浏览器和Web服务器之间不需要建立持久的连接。
HTTP是遵循请求/响应(Request/Response)模型的。
HTTP处理流程:
1.1.1建立连接
在java底层代码中是这样实现的,只不过浏览器已经帮我们做了!
1.1.2 发送请求信息 一旦建立的TCP连接,Web浏览器就会向Web服务器发送请求命令。HTTP协议将请求封装成HTTP请求,他包括请求行,请求头,空行,消息体。
1.1.3 回送响应信息
1.1.4 关闭连接
1.2 Web服务器的缺陷;
辅助的在服务器端进行注册,根据参数查找并运行。
1.3 服务器端网页编程
每次请求就打开一个CGI进程,严重消耗服务器资源。极大地限制了一个服务器可以支持的并发 CGI用户数量 。
2)java的解决法案
Web容器;
-处理安全性
Servlet
1:Servlet是常规的Java代码。代码中用了一些新的API,但是不涉及新的语法。
2:Servlet代码中有我们不熟悉的重要语句。Servlet不属于J2SE,它属于单独的规范。
3:Servlet对标准类(HttpServlet)进行了扩展。
4:Servlet没有main()方法。
这章我们主要的目标
理解Servlet
HttpServlet的public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;
这是一个Servlet的HTTP-specific方案,它相当于一个分配器,可以根据
请求方法 的类型调用相应的doXxx()方法
当你开发Servlet时,在多数情况下你不必重载这个方法。
ServletConfig接口
定义
public interface ServletConfig
这个接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet并且允许Servlet获得一个有关它的ServletContext接口的说明。每一个ServletConfig对象对应着一个唯一的Servlet。
方法
1、getInitParameter
public String getInitParameter(String name);
这个方法返回一个包含Servlet指定的初始化参数的String。如果这个参数不存在,返加空值。
2、getInitParameterNames
public Enumeration getInitParameterNames();
这个方法返回一个列表String对象,该对象包括Servlet的所有初始化参数名。如果Servlet没有初始化参数,getInitParameterNames返回一个空的列表。
3、getServletContext
public ServletContext getServletContext();
返回这个Servlet的ServletContext对象。
详情请看ServletAPI手册
<servlet>
<servlet-name>OutputStream</servlet-name>
<servlet-class>com.cy.OutputStream</servlet-class>
</servlet>
映射servlet:
<servlet-mapping>
<servlet-name>OutputStream</servlet-name>
<url-pattern>/OutputStream</url-pattern>
</servlet-mapping>
servlet配置:
<context-param><param-name>contextName</param-name><param-value>name</param-value>
</context-param>
<servlet>
....
<init-param>
<param-name>name</param-name>
<param-value>Kitty</param-value>
</init-param>
<load-on-startup>2</load-on-startup>//加载顺序排第二
</servlet>
</web-app>
Servlet在编译的代码之外有初始化参数,当参数改变时,不需要重新编译Servlet ,每个servlet都有一个与之相联的对象ServletConfig; (在servletConfig对象中包含了servlet的初始化参数信息。)
得到指定的参数value:String value= getServletConfig().getInitParameter(“name");
也可以这么写:String value= this.getInitParameter(“name"); //this可省
得到所有的所有的参数value:需要应用一个ServletConfig中的一个方法:getInitParameterNmes():返回一个Enumeration(枚举)对象,里面包含了所有的初始化参数。
- Enumeration e = this.getServletConfig().getInitParameterNames();
- while(e.hasMoreElements()){
- String name = (String)e.nextElement();
- String value = this.getServletConfig().getInitParameter(name);
- System.out.println(name+"="+value);
- }
- }
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Enumeration;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * 获取Http协议的请求行,请求头
- * @author Starjuly
- *
- */
- public class RequestDemo1 extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- System.out.println("请求行的方法:" + request.getMethod());
- System.out.println("请求行的URI:" + request.getRequestURI());
- System.out.println("请求行的URL:" + request.getRequestURL());
- System.out.println("请求行的版本:" + request.getProtocol());
- System.out.println("请求头:"+request.getHeader("User-Agent"));
- //利用迭代器遍历所有的请求头
- Enumeration names = request.getHeaderNames();
- while(names.hasMoreElements()){
- //获取请求头
- String nextElement = (String)names.nextElement();
- //获取每个请求头的内容
- String header = request.getHeader(nextElement);
- System.out.print(nextElement+" : ");
- System.out.println(header);
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
<web-app>
…
<context-param>
<param-name>admin email</param-name>
<param-value>admin@cy.com</param-value>
</context-param>
…
</web-app>
在Servlet中共享信息
servletContext.setAttribute("password", "tiger");
String password = (String) servletContext.getAttribute("password");
虚拟路径转换为物理路径:
getResourcePaths(java.lang.String path):返回一个集合,路径必须从Web应用程序的根“/”开始;
getResourceAsStream(java.lang.String path):返回一个InputStream对象。当一个资源需要逐字节读取的时候该方法比较适用。
getResource(java.lang.String path):返回一个Web资源列表。
来生成动态网页;JSP由HTML代码和JSP标签构成,可以方便地编写动态网页
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.
答案2:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
回顾上一章的知识:
Java Servlet是运行在Web服务器或应用服务器上的Java程序
Servlet规范对Servlet功能进行了严格定义
Servlet API与容器进行通讯
Servlet的编码和部署
Servlet需要在容器中进行注册和映射
容器管理Servlet的生命周期
SevletConfig对象为Servlet提供初始化参数
ServletContext对象属于整个Web应用程序
本章学习知识:
设置HTTP状态码
设置响应状态行:
HTTP状态码:
HTTP状态码:
100-199:表示信息性代码,标示客户端应该采取的其他动作,请求正在进行。
200-299:表示客户请求成功。
300-399:表示用于已经移走的资源文件,指示新的地址。
400-499:表示由客户端引发的错误。
500-599:表示由服务器端引发的错误
servlet设置状态码一般使用HttpServletResponse的setStatus()方法;
设置HTTP响应头
setContentType(String mimetype);
addCookie(Cookie c);
发送内容的服务器的类型
设置HTTP消息体
HttpServletResponse对象负责将信息返回给客户端
HttpServletResponse对象只产生一个空的HTTP响应
传回自定义的内容需要使用getWriter()或者getOutputStream()方法
–传送普通文本
–传送二进制内容
请求重定向和自动刷新页面
重定向的原理:(看三张图片):
使用sendRedirect(String URL)方法实现重定向,
response.setHeader("Refresh", "time; URL=url" );
总结:何时使用GET/POST方法:
1:请求一个静态页面或图形文件时使用GET方法,因为仅仅需要发送文件名;
2:发送大数据的时候,使用POST方法;
3:上传文件时,使用POST方法;
4:发送用户名、密码或其他保密信息的时候使用POST方法;-getRequestURI():获取请求的URI资源
Enumeration enum = request.getHeaderNames();
while (enum.hasMoreElements()) {
String headerName = (String) enum.nextElement();
String headerValue = request.getHeader(headerName);
out.print("<b>"+headerName + "</b>: ");
out.println(headerValue + "<br>");
}
获取请求消息体:
1:对用户在网站上的访问进行会话跟踪。
2:为服务器端程序提供预定义的输入。
3:存储动态产生的页面上下文信息。
隐藏字段存在一个主要的缺点,即只有每当每个页面都是动态生成的时候才有效。
B:表单是在生成动态时才有效,那么我们就使用HTTP Cookie来固定的保存在某个地方,需要是读取。
使用HTTP Cookie可以很好的维护和保留用户的状态信息,但是Cookie涉及到一些敏感的隐私问题,一些用户会禁用Cookie,这时我们需要另一个方法来解决
C:URL重写
D:Servlet提供了出色的解决方案,HttpSessionAPI,这种高级接口建立在Cookie和URL重写之上。
Session对象就是服务器为客户端创建并维护的用于存放客户状态数据的对象
一:Cookie
1:Cookie原理:
Cookie cookie = new Cookie("cool", "tiger!");
response.addCookie(cookie);
2:在Serlvet中管理Cookie
HttpSession session = request.getSession(); //getSession(false)方法使用已经存在的会话,而不必创建新会话
<session-config>
<session-timeout>15</session-timeout>
</session-config>
6:Session持久化管理
三:URL重写
URL重写方法:
response.encodeURL()
response.encodeRedirectURL(“/lovobook/sucess.html” )
URL重写是容器自动完成的,但需要我们对URL进行编码才有效
总结: