#JavaWeb(4) Servlet - Ryan的修炼之路
Servelet基础
Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序.
Servlet提供不同的方法用于响应客户端的请求:
doGet();
//响应客户端的get请求doPost();
//响应客户端的post请求doPut();
//响应客户端的put请求doDelete();
//响应客户端的delete请求
通常客户端的请求只有get和post两种, servlet为了响应两种请求必须重写doGet() 和doPost()方法
servelet生命周期
创建Servlet实例
web容器调用Servlet init () 方法进行初始化。
容器调用 Servlet 的service() 方法来处理客户端的请求。
web容器决定销毁Servlet 通过调用 destroy() 方法终止(结束)通常在关闭web应用时销毁。
在下列时刻Servlet容器装载Servlet
1.在web.xml文件中的<Servlet></Servlet>之间添加如下代码:<loadon-startup>1</load-startup>
数字越小表示优先级别越高, tomcat启动时候将自动装载servlet
2.Servlet容器启动后,客户首次向Servlet发送请求.
3.Servlet类文件被更新后,自动重新装载Servlet.
servlet路径跳转
JSP跳转到Servlet
相对路径,如href="servlet/TestServlet"
*注意:如果写成"/servlet/TestServlet"会报错,因为第一个'/'表示的是【服务器根目录:http://localhost:8080/】绝对路径,通过内置成员变量path实现,如href="<%=path%>/servlet/TestServlet"。
*注意:这里的path得到的是项目根目录,如【http://localhost:8080/Servlet002_GetFormDemo】
Servlet跳转JSP
请求重定向:response.sendRedirect(request.getContextPath()+"/xxx.jsp");这里通过request.getContextPath()方法获得项目根目录,或者通过"../xxx.jsp"取得上层路径得到
服务器内部转发:request.getRequestDispatcher("../xxx.jsp").forward(req,resp);
*小结:都可以通过../xxx.jsp得到
Servlet作为控制器
设置javabean类
public class Users { private String username;//用户名 private String mypassword;//密码 private String email;//邮箱 private String gender;//性别 private Date birthday; private String[] favorites;//爱好 private String introduce;//自我接受 private boolean flagt;//是否接受协议 public Users() {} ... //geter 和setter方法省略
在login.jsp中把表单数据递交给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> <head> <base href="<%=basePath%>"> <title>My JSP 'reg.jsp' starting page</title> </head> <body> <h1>用户注册</h1> <hr> <form name="regForm" action="servlet/RegServlet" method="post" >//表单提交给RegServlet这个servlet控制器 <table border="0" width="800" cellspacing="0" cellpadding="0"> <tr> <td class="lalel">用户名:</td> <td class="controler"><input type="text" name="username" /></td> </tr> <tr> <td class="label">密码:</td> <td class="controler"><input type="password" name="mypassword" ></td></tr> <tr> <td class="label">确认密码:</td> <td class="controler"><input type="password" name="confirmpass" ></td></tr> <tr> <td class="label">电子邮箱:</td> <td class="controler"><input type="text" name="email" ></td></tr> <tr> <td class="label">性别:</td> <td class="controler"><input type="radio" name="gender" checked="checked" value="Male">男<input type="radio" name="gender" value="Female">女</td></tr> <tr> <td class="label">出生日期:</td> <td class="controler"> <input name="birthday" type="text" id="control_date" size="10" maxlength="10" onclick="new Calendar().show(this);" readonly="readonly" /> </td> </tr> <tr> <td class="label">爱好:</td> <td class="controler"> <input type="checkbox" name="favorite" value="nba"> NBA <input type="checkbox" name="favorite" value="music"> 音乐 <input type="checkbox" name="favorite" value="movie"> 电影 <input type="checkbox" name="favorite" value="internet"> 上网 </td> </tr> <tr> <td class="label">自我介绍:</td> <td class="controler"><textarea name="introduce" rows="10" cols="40"></textarea> </td> </tr> <tr> <td class="label">接受协议:</td> <td class="controler"><input type="checkbox" name="isAccept" value="true">是否接受霸王条款 </td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="注册"/> <input type="reset" value="取消"/> </td> </tr> </table></form> </body></html>
servlet的doPost方法
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { request.setCharacterEncoding("utf-8"); Users u = new Users(); String username; String mypassword, gender, email, introduce; String[] favorites; Date birthday; String isAccept; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd-"); try {username = request.getParameter("username");mypassword = request.getParameter("mypassword");gender = request.getParameter("gender");email = request.getParameter("email");introduce = request.getParameter("introduce");birthday = sdf.parse(request.getParameter("birthday"));favorites = request.getParameterValues("favorite");isAccept = request.getParameter("isAccept");u.setUsername( username);u.setMypassword(mypassword);u.setGender(gender);u.setEmail(email);u.setFavorites(favorites);if(isAccept.equals("true")) { u.setFlagt(true);}u.setBirthday(birthday);//把用户对象保存在session中request.getSession().setAttribute("resUser", u);request.getRequestDispatcher("../userinfo.jsp").forward(request, response); } catch (Exception e) {// TODO: handle exceptione.printStackTrace(); }
把表单提交的参数都存储到一个名为resUers的javabea对象里, 然后把对象存在session中, 这样在下一个页面就可以接收到这个对象的参数了.