Servlet的学习和理解
Posted yuyiwang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet的学习和理解相关的知识,希望对你有一定的参考价值。
一.ServletContext接口
Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的应用。
由于每一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,SevletContext对象被称为application对象(WEB应用程序对象)。
功能:
1.获取web应用程序的初始化参数
2.记录日志
3.appliciation域范围的属性
4.访问资源文件
5.获取虚拟路径所映射的本地路径
6.web应用程序之间的访问
7.ServletContext的其他方法
ServletContext:
1).可以由ServletConfig获取
2).该对象代表当前web应用:可以认为ServletContext是当前WEB应用的一个大管家,可以从中获取当前web应用的各个方面的信息。
2.1获取当前web应用的初始化参数:可以为所有的Servlet所获取,而Servlet的初始化参数只能用那个Servlet可以获取
1 <context-param> 2 <param-name>driver</param-name> 3 <param-value>com.mysql.jdbc.Driver</param-value> 4 </context-param> 5
方法:
getInitParameter
getinitParameterNames
代码:
ServletContext servletContext=servletConfig.getServletContext(); String driver=servletConfig.getInitParameter("driver"); System.out.println("driver"+driver); Enumeration<String> names2=servletContext.getInitParameterNames(); while(names2.hasMoreElements()) { String name=names2.nextElement(); System.out.println("-->"+name); }
2.2获取当前WEb应用的某一个文件在服务器上的绝对路径,而不是部署前的路径
getRealPath(String path);
2.3获取WEB应用的名称;
getContextPath()
代码:
String contextPath=servletContext.getContextPath();
System.out.println(contextPath);
2.4获取当前WEB应用的某一个文件对应的输入流
getResourceAssStream(String path):path的/为当前WEB应用的根目录.
代码:
Classloader classLoader=getClass.getClassLoader();
InputStream is2=servletContext.getResourceAssStream("jdbc.properties");
System.out.println("1."+is);("/WEB-INF/classes/jdbc.properties");
自己新建一个jdbc.properties
2.5和atttrubute相关的几个方法
二.Http简介
WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议集中的一个应用层协议,用于定义web浏览器与WEB服务之间交换 数据的过程以及数据本身的格式。
HTTP协议的版本HTTP/1.0,HTTP/1.1,HTTP-NG
使用GET和POST方式传递参数
在URL地址后面可以附加一些参数
举例:http://www.it1315.org/servlet/ParamsServlet?param1=abc¶m2=xyz
GET方式
举例:GET/servlet/param1=abc¶m2=xyz HTTP/1.1
特点:传送的数据量是有限制的,一般限制在1kb以下
POST方式
举例:POST/servlet/param1=abc¶m2=xyz HTTP/1.1
Host:
Content-Type:appliciation/x-www-form-urlencoded
Context-Length:28
param1=abc¶m2=xyz
特点:传送的数据量要比GET方式传送的数据量大得多
Get请求和Post请求:
1).使用GET方式传递参数:
1.1在浏览器地址中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的方式为GET
1.2如果网页中的<form>表单元素中的method属性被设置为"GET",浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET.
1.3使用GET请求方式给WEB服务器传递参数的格式:
http://www.atguigu.net/counter.jsp?name&password=123
1.4使用GET方式传送数据量一般限制在1kb以下。
2).使用POST方式传递参数:
2.1 POST请求方式主要向WEB服务器端程序提交FORM表单中的数据:form表单中的method置为POST
2.2 POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
POST/counter.jsp HTTP/1.1
referer:http://localhost:8080/Register.html
content-type:application/x-www-form-urlencoded
host:localhost:8080
content-length:43
name=zhangsan&password=123 --请求体重传递参数。
三.如何在Servlet中获取请求信息:
1).Servlet的service()方法用于应答请求:因为每次请求都会调用service()方法。
public void service(ServletRequest request,ServletResponse response)throws ServletException,IOEcxeption
ServletRequest:封装了请求信息,可以从中获取到任何的请求信息
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的实现方法
2).这两个接口的实现类都是服务器给与实现的,并在服务器调用service方法时传入
ServletRequest:
2.1获取请求参数;
>String getParameter(String name):根据请求参数的名字,返回参数值。
>Map getParameterNames():返回请求参数的键值对:参数名,value:参数值,String数组类型
Enumeration getParameternames():返回参数名对应的Enumeration对象,
类似于ServletConfig(或ServletContext)的getInitParameterNames(方法)。
>String[] get ParameterValues(String name):根据请求参数的名字,返回字符串数组。
若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值。
2.2获取请求的URl:
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
String requestURI=httpServletRequest.getRequestURI();
System.out.println(requestURI);
2.3获取请求方式:
String Method=httpServletRequest.getMethod();
System.out.println(Method);
2.4若是一个GET请求,获取请求参数对应的那个字符串,就是?后面的那个字符串
String queryString=httpServletRequest.getQueryString();
System.out.println(queryString);
2.5获取请求的Servlet的映射路径
String servletPath=httpServletRequest.getServletPath();
System.out.println(servletPath);
2.6和attribute相关的几个方法
3).HttpServletRequest:是ServletRequest的子接口,针对于HTTP请求所定义,里面包含了大量获取HTTP请求相关的方法。
4).
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的实现方法
4.1 getWriter():返回PrintWriter对象,调用该对象的print()方法,将print()中的参数直接打印到客户的浏览器上。PrintWriter out=reponse.getWriter();
out.println("hello world...");
4.2 设置响应的内容类型setContextType()
reponse.setContentType("application/msword");
4.3 void sendRedirect(String Location):请求的重定向。(此方法为HttpServletReponse 中定义。)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
练习:在web.xml文件中设置两个WEB应用的初始化参数,user,password.
定义一个login.html,里面定义两个请求字段:user,password
在创建一个LoginServlet,在其中获取请求的user,password。比对其和web.xml文件中定义的请求参数是否一致,若一致,响应hello:xxx,若不一致,响应sorry:xxx xxx为user.
目录:
web.mxl
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.yuyi.javaweb.loginServlet</servlet-class> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping> </web-app>
login,html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录界面</title> </head> <body> <form action="loginServlet" method="post"> user:<input type="text" name="user"> password:<input type="password" name="password"> <br><br> interesting: <input type="checkbox" name="interesting" value="reading"/>Reading <input type="checkbox" name="interesting" value="game"/>Game <input type="checkbox" name="interesting" value="shopping"/>Shopping <input type="checkbox" name="interesting" value="party"/>Party <input type="checkbox" name="interesting" value="sport"/>Sport <input type="checkbox" name="interesting" value="sing"/>Sing <input type="submit" value="Submit"> </form> </body> </html>
loginServlet.java
package com.yuyi.javaweb; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.EnumMap; import java.util.Enumeration; import java.util.Map; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class loginServlet implements Servlet{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public void service(ServletRequest request, ServletResponse reponse) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("请求来了!"); System.out.println(reponse); String user=request.getParameter("user"); String password=request.getParameter("password"); System.out.println(user+","+password); String interesting=request.getParameter("interesting"); System.out.println(interesting); String[] interestings=request.getParameterValues("interesting"); for(String intertest:interestings) { System.out.println("interesting:"+intertest); } Enumeration<String> names=request.getParameterNames(); while(names.hasMoreElements()) { String name=names.nextElement(); String val=request.getParameter(name); System.out.println(val); } Map<String,String[]>map=request.getParameterMap(); for(Map.Entry<String, String[]>entry:map.entrySet()) { System.out.println(entry.getKey()+":"+Arrays.asList(entry.getValue())); } HttpServletRequest httpServletRequest=(HttpServletRequest)request; String requestURI=httpServletRequest.getRequestURI(); System.out.println(requestURI); String Method=httpServletRequest.getMethod(); System.out.println(Method); String queryString=httpServletRequest.getQueryString(); System.out.println(queryString); String servletPath=httpServletRequest.getServletPath(); System.out.println(servletPath); reponse.setContentType("application/msword"); PrintWriter out=reponse.getWriter(); out.println("hello world..."); } }
四.GenericServlet(了解)
1).是一个Servlet.是Servlet接口和ServletConfig接口的实现类,但是一个抽象类,其中的service方法为抽象方法
2).如果新建的Service程序直接继承GenericsServlet会使开发更简洁
3.1.在GenericServlet声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法对其初始化
3.2利用servletConfig成员变量的方法实现了ServletConfig接口的方法
3.还定义了一个init(Config)方法,在init(ServletConfig)方法对其调用,子类可以直接覆盖init()在其中实现对Servlet的初始化
4.不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),还是用了ServletConfig接口的方法,则会出现空指针异常
3.5新建的init{}并非Servlet的生命周期方法,而intit(ServletConfig)是生命周期相关的方法.
package com.yuyi.ServletTest; import java.io.IOException; import java.util.Enumeration; /** * 自定义的一个Servlet接口实现类,让任何开发Servlet继承该类,以简化开发 */ import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public abstract class MyGenericServlet implements Servlet,ServletConfig{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return ServletConfig; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } private ServletConfig ServletConfig; @Override public void init(ServletConfig arg0) throws ServletException { this.ServletConfig=arg0; } @Override public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException ; /** 以下方法为ServletConfig接口的方法**/ @Override public String getInitParameter(String arg0) { // TODO Auto-generated method stub return ServletConfig.getInitParameter(arg0); } @Override public Enumeration<String> getInitParameterNames() { // TODO Auto-generated method stub return ServletConfig.getInitParameterNames(); } @Override public ServletContext getServletContext() { // TODO Auto-generated method stub return ServletConfig.getServletContext(); } @Override public String getServletName() { // TODO Auto-generated method stub return ServletConfig.getServletName(); } }
2.HttpServlet:
1).是一个Servlet,继承自Genericservlet.针对于Http协议所定制。
2).在service()方法中直接把ServletRequest和ServletReponse转为HttpRequest和HttpReponse
并调用了重载的service(HttpRequest,HttpReponse)
在service(HttpRequest,HttpReponse)获取了请求方式:request.getMethod().
doxxx() 方法(xxx 为具体的请求方式,比如doGet,doPost)
代码:
public class MyHttpServletRequest extends MyGenericServlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
if(arg0 instanceof HttpServletRequest) {
HttpServletRequest request=(HttpServletRequest)arg0;
if(arg1 instanceof HttpServletResponse) {
HttpServletResponse response=(HttpServletResponse)arg1;
service(arg0, arg1);
}
}
}
public void service(HttpServletRequest request,HttpServletResponse reponse) throws ServletException,IOException{
//1.获取请求方式。
String method=request.getMethod();
//2.根据请求方法再调用对应的处理
方法
if("GET".equalsIgnoreCase(method)) {
doGet(request,reponse);
}
else if("POST".equalsIgnoreCase(method)) {
doPost(request,reponse);
}
}
private void doPost(HttpServletRequest request, HttpServletResponse reponse) {
// TODO Auto-generated method stub
}
private void doGet(HttpServletRequest request, HttpServletResponse reponse) {
// TODO Auto-generated method stub
}
}
3).实际开发中,直接继承httpServlet,并根据请求方式复写doxxx()方法接口
4).好处:直接由针对的覆盖doxxx方法;直接使用HttpServletrequest和Httpreponse,不需要强转。
在MySQl数据库创建一个test_users数据表,添加三个字段
定义一个login.html,里面定义两个请求字段:id,user,password.并录入几条记录user,password
在创建一个LoginServlet(需要继承自HttpServlet,并重写doPost方法),在其中获取请求的user,password。利用JDBC从test_user中查询有没有和页面输入的user,password对应的记录,
SELECT count(id) FROM test_users WHERE user=?
若有,响应Hello:xxx,若不一致,响应sorry:xxx xxx为user.
1.数据库的话就自己建立
2.目录
3.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 初始化参数 --> <context-param> <param-name>user</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>123456</param-value> </context-param> <!-- 配置servlet --> <servlet> <servlet-name>loginServlet3</servlet-name> <servlet-class> com.yuyi.ServletTest.loginServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet3</servlet-name> <url-pattern>/loginServlet3</url-pattern> </servlet-mapping> </web-app>
4.login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录界面</title> </head> <body> <form action="loginServlet3" method="post"> user:<input type="text" name="username"/> password:<input type="password" name="password"/> <input type="submit" value="Submit"/> </form> </body> </html>
5.loginServlet3.java
package com.yuyi.ServletTest;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class loginServlet3 extends HttpServlet{
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
PrintWriter out=response.getWriter();
String sql="SELECT count(id)from users WHERE username=?"+"AND password=?";
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test";
String user="root";
String password2="628081abc";
connection=(Connection) DriverManager.getConnection(url,user,password2);
statement=(PreparedStatement) connection.prepareStatement(sql);
statement.setString(1, username);
statement.setString(2, password);
resultSet=statement.executeQuery();
if(resultSet.next()) {
int count=resultSet.getInt(1);
if (count>0) {
out.println("Hello,"+username);
}else {
out.println("sorry,"+username);
}
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(resultSet!=null) {
resultSet.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try {
if(statement!=null) {
statement.close();
}
} catch (SQLException e) {
}
try {
if(connection!=null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
}
以上是关于Servlet的学习和理解的主要内容,如果未能解决你的问题,请参考以下文章