说明:
创建Servlet的方式,在上篇博客中,已经用了方式1(实现Servlet接口),接下来本节讲的是另外2种方式。
上篇博客地址:http://blog.csdn.net/qq_26525215/article/details/51942252
简单的用户注册功能(我们设置了所以权限都是开放的),可以实现:
1、用户注册。
2、查询所有用户
3、删除某个用户
创建Servlet的方式二:继承 GenericServlet
SecondServlet.java:
package cn.hncu.servlet.day2; import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //以继承GenericServlet 的方式 写 servlet public class SecondServlet extends GenericServlet{ //一个小知识点!!! //适配器模式的一个知识点:适配器中的init(ServletConfig config)中帮我们把它当中的config对象赋值 且调用一个空参的init()。 //我们以后应该覆盖空参的init()。因为如果覆盖了这个带参数的,那么就无法实现为它的config对象赋值,由此导致其中使用config对象(this.)的方法会出错。 其实这种方法(调用 一个空参的init()且 该参数方法中什么也没做 )也程序员之间的一种交流方式,告诉我们要覆盖空参的方法,这样它在帮我们做完事情会调用我们的覆盖方法 // @Override // public void init(ServletConfig config) throws ServletException { // System.out.println(config);//这里不会出现问题,父类:init(ServletConfig config)中有这一句:this.config = config; // String charset = config.getInitParameter("charset"); // System.out.println(charset); // System.out.println("init..."+this); // } @Override public void init() throws ServletException { System.out.println("init...."+this); } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { //String charset = this.getInitParameter("charset"); //如果本例写了init(ServletConfig config)方法,覆盖了父类的init(ServletConfig config)方法,这句会出异常 //System.out.println(charset); String charset = this.getInitParameter("charset"); System.out.println(charset); request.setCharacterEncoding("utf-8"); String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); System.out.println("name:"+name+",pwd:"+pwd); } }
index.jsp:
<hr/> <h1>下面是本章节博客的内容</h1> <h2>演示servlet技术---第二种创建Servlet的方式(继承GenericServlet)</h2> <form action="/myServletDemo/second" method="post"> 访问SecondServlet<br/> 姓名:<input type="text" name="name"/> <br/> 密码:<input type="password" name="pwd"/><br/> <input type="submit" value="提交" /> </form>
web.xml:
<!-- 下面的是今天这节博客的 --> <servlet> <servlet-name>SecondServlet</servlet-name> <servlet-class>cn.hncu.servlet.day2.SecondServlet</servlet-class> <init-param> <param-name>charset</param-name> <param-value>utf-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>SecondServlet</servlet-name> <url-pattern>/second</url-pattern> </servlet-mapping>
演示结果:
填写好姓名,密码后点击提交:
再看后台:
创建Servlet的方式三:继承HttpServlet
index.jsp:
<h2>演示servlet技术---第三种Servlet的方式(继承HttpServlet)</h2> <form action="/myServletDemo/third" method="post"> 访问ThirdServlet<br/> 姓名:<input type="text" name="name"><br/> 密码:<input type="password" name="pwd"><br/> <input type="submit" value="提交" /> </form>
web.xml:
<servlet> <servlet-name>ThirdServlet</servlet-name> <servlet-class>cn.hncu.servlet.day2.ThirdServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ThirdServlet</servlet-name> <url-pattern>/third</url-pattern> </servlet-mapping>
ThirdServlet.java:
package cn.hncu.servlet.day2; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //注意:采用继承HttpServlet的方式写servlet,doGet和doPost这2个方法通常都要覆盖 //否则如果doGet方法没覆盖,有get请求时就会出现405错误,不覆盖doPost方法同理 public class ThirdServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post"); } }
覆盖doGet和doPost这2个方法的说明:
注意:采用继承HttpServlet的方式写servlet,doGet和doPost这2个方法通常都要覆盖
否则如果doGet方法没覆盖,有get请求时就会出现405错误,不覆盖doPost方法同理.
产生这个的原因是:
我们来看底层代码:
这是一个常量:
public static final int SC_METHOD_NOT_ALLOWED = 405;
因为HttpServlet继承GenericServlet,GenericServlet implements Servlet。所以,当客户端访问的时候,最先找的是:父类的servlet
也就是:service(ServletRequest req, ServletResponse res)
这个方法继续调用:service(request, response);
再通过这个方法调用doGet()或doPost()或其他方法。
如果我们没覆盖doGet()或doPost()。
我们用的是http1.1协议,会调用resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);于是出现了405错误!
演示结果:
我们将表单提交的方式定义成post提交了的。默认是get