1 编写流程
1)在网页端提交表单数据,根据url调用tomcat服务器中的Servlet程序(http://localhost:8080/ServletTest1/register),这个注册请求会调用tomcat中的名字为register的servlet程序
2)根据上一步所知,在web.xml中找到 /register,其对应的类是com.book.web.RegisterServle
<servlet>
<servlet-name>register</servlet-name>
<servlet-class>com.book.web.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
3)编写相应的Servlet程序
public class RegisterServlet extends HttpServlet {
// private UserService userservice=new UserServiceImpl(); 在这里声明变量会报错,因为在web下的jar没有导入到WEB-INF的lib中
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserService userservice=new UserServiceImpl(); //
//密码参数不显示
//1.获取参数
// Connection connetion = jdbcutils.getConnetion();
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
String code = req.getParameter("code");
System.out.println(username);
//2.检查验证码合法与否
if("abcde".equals(code)){
if(userservice.existUsername("root"))
System.out.println("用户名已经存在");
else{//将用户数据保存进数据库,使用service,间接调用的Dao
System.out.println("存进数据库");
userservice.registerUser(new user(username,password,email));
}
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/pages/user/regist_success.html");
requestDispatcher.forward(req,resp);
}
else{ //不合法,返回注册页面
System.out.println("验证码错误");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/pages/user/regist.html");
requestDispatcher.forward(req,resp);
}
}
}
2 Servlet类的简介
1 Servlet类
public interface Servlet {
//生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
void init(ServletConfig var1) throws ServletException;
//生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
2 GenericServlet类
在 GenericServlet 中,主要完成了以下任务:
- 在init() 中的 ServletConfig 赋给一个类级变量,可以由 getServletConfig 获得
- 为 Servlet 所有方法提供默认实现
- 可以直接调用 ServletConfig 中的方法
abstract class GenericServlet implements Servlet,ServletConfig{
//GenericServlet通过将ServletConfig赋给类级变量
private trServletConfig servletConfig;
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
/*自定义init()的原因是:如果子类要初始化必须覆盖父类的init() 而使它无效 这样
this.servletConfig=servletConfig不起作用 这样就会导致空指针异常 这样如果子类要初始化,
可以直接覆盖不带参数的init()方法 */
this.init();
}
//自定义的init()方法,可以由子类覆盖
//init()不是生命周期方法
public void init(){
}
//实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法
public abstract void service(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException{
}
//实现空的destroy方法
public void destroy(){ }
}
3 HttpServlet
HttpServlet 中对原始的 Servlet 中的方法都进行了默认的操作,不需要显式的销毁初始化以及 service(),在 HttpServlet 中,自定义了一个新的 service() 方法,其中通过 getMethod() 方法判断请求的类型,从而调用 doGet() 或者 doPost() 处理 get,post 请求,使用者只需要继承 HttpServlet,然后重写 doPost() 或者 doGet() 方法处理请求即可。
abstract class HttpServlet extends GenericServlet{
//HttpServlet中的service()
protected void service(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse){
//该方法通过httpServletRequest.getMethod()判断请求类型调用doGet() doPost()
}
//必须实现父类的service()方法
public void service(ServletRequest servletRequest,ServletResponse servletResponse){
HttpServletRequest request;
HttpServletResponse response;
try{
request=(HttpServletRequest)servletRequest;
response=(HttpServletResponse)servletResponse;
}catch(ClassCastException){
throw new ServletException("non-http request or response");
}
//调用service()方法
this.service(request,response);
}
}
4 doGet和doPost
底层都是TCP连接
1)但GET一般用于获取/查询资源信息,而POST一般用于更新资源信息
2)GET参数通过URL传递,POST放在Request body中
3)由于上一个不同,所以两者传递的参数长度限制不同:其实两者都没有长度限制,但是url是在浏览器地址栏,所以会被浏览器限制;而post利用requestBody则没有限制(100K)
4)POST的安全性要比GET的安全性高,也是因为第2个不同导致的(url参数在地址栏可见)
在jsp中的form中,默认的提交方式就是get