需要先掌握IOC和Servlet
ioc:就是类的继承,接口一些东西,就是java基础里的类的继承那些
Servlet:电脑先给web服务器Tomcat(就是小老虎图标) 传一个http请求这个Tomcat里面有个Servlet:容器,这个容器初始化servlet将你的HTTP请求转化为:requst对象,转发requst对象对requst对象相应的servlet进行处理,处理成功后会返回一个response,然后tomcat把这个response转化成http相应再发回电脑
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类
Servlet是Java的4个jar包里的一堆接口
Serclet接口,SercletRequest接口,SercletRespose接口,SercletContext接口,SercletConf SercletDispatcher接口,Filter接口,GenericServlet抽象类来实现Serclet接口
它是所有Servlet类必须直接或者间接实现的一个接口
1.需要现有Servlet的jar包需要小老虎,如果没有的话按照网上教程整一个,然后再导入小老虎再把需要的jar包弄出来,然后就整个类继承Servlet的这个接口,在实现里面的方法
效果如下
package lianxi; import javax.servlet.*; import java.io.IOException; public class deom implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("正在被初始化"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //这个是专门为客户提供响应的方法, System.out.println("Service正在提供服务"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("Service正在呗销毁"); } }
ServletRequset接口
Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。
Servlet 的其它两个方法
getServletInfo( ),这个方法会返回Servlet的一段描述,可以返回一段字符串。 getServletConfig( ),这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象
int getContentLength();//返回请求主体的字节数 String getContentType();//返回主体的MIME类型 String getParameter(String var1);//返回请求参数的值 //getParameter是在ServletRequest中最常用的方法,可用于获取查询字符串的值。
ServletResponse接口
ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。
public interface ServletResponse { String getCharacterEncoding(); String getContentType(); //向浏览器发送一个二进制数据 ServletOutputStream getOutputStream() throws IOException; //*它返回了一个可以向客户端发送文本的的Java.io.PrintWriter对象* PrintWriter getWriter() throws IOException; void setCharacterEncoding(String var1); void setContentLength(int var1); //在发送任何HTML之前,这个方法,设置响应的内容类型 void setContentType(String var1); void setBufferSize(int var1); int getBufferSize(); void flushBuffer() throws IOException; void resetBuffer(); boolean isCommitted(); void reset(); void setLocale(Locale var1); Locale getLocale(); }
ServletConfig接口
当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init( )方式传入一个ServletConfig对象。
public class deom implements ServletConfig { @Override public String getServletName() { return null;//获得Servlet在web.xml中配置的name值 } @Override public ServletContext getServletContext() { return null; } @Override public String getInitParameter(String s) { return null; //获得Serclet初始化参数的 } @Override public Enumeration<String> getInitParameterNames() { return null;//获得所有Servlet的初始化参数的名称 } }
ServletContext对象
ServletContext对象表示Servlet应用程序。每个Web应用程序都只有一个ServletContext对象。在将一个应用程序同时部署到多个容器的分布式环境中,每台Java虚拟机上的Web应用都会有一个ServletContext对象。
通过在ServletConfig中调用getServletContext方法,也可以获得ServletContext对象。
那么为什么要存在一个ServletContext对象呢?存在肯定是有它的道理,因为有了ServletContext对象,就可以共享从应用程序中的所有资料处访问到的信息,并且可以动态注册Web对象。前者将对象保存在ServletContext中的一个内部Map中。保存在ServletContext中的对象被称作属性。
GenericServlet抽象类
Servlet一直是通过实现Servlet接口来编写的,但是,使用这种方法,则必须要实现Servlet接口中定义的所有的方法,实现Servlet是比较麻烦的。
所以出现了GenericServlet抽象类的出现很好的解决了这个问题。本着尽可能使代码简洁的原则,GenericServlet实现了Servlet和ServletConfig接口,
public abstract class deom implements Servlet,ServletConfig, Serializable { //它里面提供了所有默认方法,就是不用挨个继承,想用哪个用哪个 private static final String LSTRING_FILE = "javax,servlet.LocalStrings"; private static ResourceBundle lStrings = ResourceBundle.getBundle("javax,servlet.LocalStrings"); private transient ServletConfig config; public void destroy(){} public String getInitParameter(String name){ ServletConfig sc = this.getServletConfig(); if (sc == null){ throw new IllegalStateException(lStrings.getString("err.servllet_config_not_initialized")); }else {return sc.getInitParameter(name);} } public Enumeration<String> getInitParameterNames(){ ServletConfig sc = this.getServletConfig(); if (sc == null){ throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); }else {return sc.getInitParameterNames();} } public ServletConfig getServletConfig(){ return this.config; } public ServletContext getServletContext(){ ServletConfig sc = this.getServletConfig(); if (sc == null){ throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } else { return sc.getServletContext();} } public String getServletInfo(){ return ""; } public void init(ServletConfig config)throws ServletException { this.config = config; this.init(); } public void init() throws ServletException{} public void log(String msg) { this.getServletContext().log(this.getServletName() + ":" + msg); } public void log(String massage,Throwable t) { this.getServletContext().log(this.getServletName() + ":" + massage,t); } public abstract void service(ServletRequest var1,ServletResponse var2) throws ServletException,IOException; public String getServletName(){ ServletConfig sc = this.getServletConfig(); if (sc == null){ throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); }else { return sc.getServletName(); } } }
HttpServletRequest接口
HttpServletRequest表示Http环境中的Servlet请求。它扩展于javax.servlet.ServletRequest接口,并添加了几个方法。
String getContextPath();//返回请求上下文的请求URI部分
Cookie[] getCookies();//返回一个cookie对象数组
String getHeader(String var1);//返回指定HTTP标题的值
String getMethod();//返回生成这个请求HTTP的方法名称
String getQueryString();//返回请求URL中的查询字符串
HttpSession getSession();//返回与这个请求相关的会话对象
HttpServletRequest内封装的请求
通过request获得请求行,请求头,请求体,
//获得请求行
/获得请求行 假设查询字符串为:username=zhangsan&password=123 获得客户端的请求方式:String getMethod() 获得请求的资源: String getRequestURI() StringBuffer getRequestURL() String getContextPath() ---web应用的名称 String getQueryString() ---- get提交url地址后的参数字符串 ———————————————————————————————————————————————— //获得请求头 long getDateHeader(String name) String getHeader(String name) Enumeration getHeaderNames() Enumeration getHeaders(String name) int getIntHeader(String name) ———————————————————————————————————————————————— //获得请求体 请求体中的内容是通过post提交的请求参数,格式是: username=zhangsan&password=123&hobby=football&hobby=basketball key ---------------------- value username [zhangsan] password [123] hobby [football,basketball] 以上面参数为例,通过一下方法获得请求参数: String getParameter(String name) String[] getParameterValues(String name) Enumeration getParameterNames() Map<String,String[]> getParameterMap() ————————————————————————————————————————————————
Request和Response乱码问题的解决方法
在service中使用的编码解码方式默认为:ISO-8859-1编码,但此编码并不支持中文,因此会出现乱码问题,所以我们需要手动修改编码方式为UTF-8编码