1. 什么是Servlet
先有Servlet,后来才有Jsp。Jsp的前身就是Servlet。
Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序。
2. Tomcat容器等级
3. 手工编写第一个Servlet
- 继承HttpServlet
- 重写doGet()或者doPost()方法
- 在web.xml中注册Servlet
HelloServlet.java
新建类时,记得继承HttpServlet喔
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("处理Get()请求。。。。");
PrintWriter out = response.getWriter();
response.setContentType("text/html;charset=utf-8");
out.println("<strong>Hello Servlet!<strong><br>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("处理Post()请求。。。。");
PrintWriter out = response.getWriter();
response.setContentType("text/html;charset=utf-8");
out.println("<strong>Hello Servlet!<strong><br>");
}
web.xml(注册servlet)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!-- 访问这个servlet的路径 -->
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
index.jsp(访问servlet)
<body>
<h1>第一个servlet小例子</h1>
<hr>
<!-- 访问路径servlet/HelloServlet -->
<a href="servlet/HelloServlet">Get方式请求HelloServlet</a><br>
<form action="servlet/HelloServlet" method="post">
<input type="submit" value="Post方式请求HelloServlet"/>
</form>
</body>
使用MyEcliose直接新建servlet则更简单:新建servlet后直接重写doGet()和doPost()方法,然后再index.jsp或其他页面访问即可
4. Servlet生命周期
4.1 访问servlet是程序流程
响应客户请求阶段,调用service()方法,由service()方法根据提交方式选择执行doGet()或者doPost()方法
4.2 Tomcat装载Servlet的三种情况
- servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的
<Servlet></Servlet>
之间添加如下代码:<loadon-startup>1</loadon-startup>
数字越小表示优先级别越高。 - 在Servlet容器启动后,客户首次向Servlet发送请求。
- Servlet类文件被更新后,重新装载Servlet
* Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,inti()方法只被调用一次。 *
4.3 Servlet生命周期
5. Servlet获取九大内置对象
6. Servlet与表单
6.1 reg.jsp表单中填写数据,action提交到RegServlet,在RegServlet中将表单传过来的数据封装在一个User对象中,将其设置为属性,然后跳转到userinfo.jsp,在userinfo.jsp把数据显示出来
reg.jsp
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'reg.jsp' starting page</title>
<style type="text/css">
.label{
width: 20%
}
.controler{
width: 80%
}
</style>
<script type="text/javascript" src="js/Calendar3.js"></script>
</head>
<body>
<h1>用户注册</h1>
<hr>
<form name="regForm" action="servlet/RegServlet" method="post" >
<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);" />
</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" checked="checked">是否接受霸王条款
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="注册"/>
<input type="reset" value="取消"/>
</td>
</tr>
</table>
</form>
</body>
</html>
RegServlet.java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Users u = new Users();
String username, mypassword, gender, email, introduce, isAccept;
Date birthday;
String[] favorites;
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");
if (request.getParameterValues("isAccept") != null) {
isAccept = request.getParameter("isAccept");
} else {
isAccept = "false";
}
// 将从表单获取的值封装成一个User对象
u.setUsername(username);
u.setMypassword(mypassword);
u.setGender(gender);
u.setEmail(email);
u.setFavorites(favorites);
u.setIntroduce(introduce);
// u.setAccept(isAccept.equals("true")?true:false);
if (isAccept.equals(true)) {
u.setFlag(true);
} else {
u.setFlag(false);
}
u.setBirthday(birthday);
// 把注册成功的用户对象保存在session中
request.getSession().setAttribute("regUser", u);
// 跳转到注册成功的页面
request.getRequestDispatcher("../userinfo.jsp").forward(request,
response);
} catch (Exception e) {
e.printStackTrace();
}
}
userinfo.jsp
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'userinfo.jsp' starting page</title>
<style type="text/css">
.title{
width: 30%;
background-color: #CCC;
font-weight: bold;
}
.content{
width:70%;
background-color: #CBCFE5;
}
</style>
</head>
<body>
<h1>用户信息</h1>
<hr>
<center>
<jsp:useBean id="regUser" class="entity.Users" scope="session" />
<table width="600" cellpadding="0" cellspacing="0" border="1">
<tr>
<td class="title">用户名:</td>
<td class="content"> <jsp:getProperty name="regUser" property="username"/></td>
</tr>
<tr>
<td class="title">密码:</td>
<td class="content"> <jsp:getProperty name="regUser" property="mypassword"/></td>
</tr>
<tr>
<td class="title">性别:</td>
<td class="content"> <jsp:getProperty name="regUser" property="gender"/></td>
</tr>
<tr>
<td class="title">E-mail:</td>
<td class="content"> <jsp:getProperty name="regUser" property="email"/></td>
</tr>
<%-- readonly="readonly" --%>
<tr>
<td class="title">出生日期:</td>
<td class="content">
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(regUser.getBirthday());
%>
<%=date%>
</td>
</tr>
<tr>
<td class="title">爱好:</td>
<td class="content">
<%
String[] favorites = regUser.getFavorites();
for(String f:favorites)
{
%>
<%=f%>
<%
}
%>
</td>
</tr>
<tr>
<td class="title">自我介绍:</td>
<td class="content"> <jsp:getProperty name="regUser" property="introduce"/></td>
</tr>
<tr>
<td class="title">是否接受协议:</td>
<td class="content"> <jsp:getProperty name="regUser" property="flag"/></td>
</tr>
</table>
</center>
</body>
</html>
6.2 用servlet实现用户登录
login.jsp
<body>
<div id="container">
<div class="logo">
<a href="#"><img src="assets/logo.png" alt=""/></a>
</div>
<div id="box">
<form action="servlet/LoginServlet" method="post">
<p class="main">
<label>用户名:</label>
<input name="username" value=""/>
<label>密码: </label>
<input type="password" name="password" value="">
</p>
<p class="space">
<input type="submit" value="登录" class="login" style="cursor: pointer;"/>
</p>
</form>
</div>
</div>
</body>
LoginServlet.java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Users u = new Users();
String username = request.getParameter("username");
String password = request.getParameter("password");
u.setUsername(username);
u.setPassword(password);
request.getSession().setAttribute("loginUser", u);
//判断用户名和密码是否合法
if (u.getUsername().equals("admin")&&u.getPassword().equals("admin")) {
response.sendRedirect(request.getContextPath()+"/login_success.jsp");
}else {
response.sendRedirect(request.getContextPath()+"/login_failure.jsp");
}
}
7. Servlet路径跳转
通过index.jsp页面直接请求servlet
<body>
<h1>Servlet路径跳转</h1>
<hr>
<!-- 通过index.jsp页面直接请求servlet -->
<!-- <url-pattern>/servlet/HelloServlet</url-pattern>必须以/开头,这个开头的/表示项目的根目录 -->
<!-- 使用相对路径访问HelloServet -->
<!-- /servlet/HelloServlet 第一个/表示服务器的根目录,而不是项目的根目录,所以不行 -->
<a href="servlet/HelloServlet">用相对路径访问HelloServlet</a><br>
<!-- 使用绝对路径访问HelloServet 可以使用path变量,它表示项目的根目录-->
<a href="<%=path%>/servlet/HelloServlet">用绝对路径访问HelloServet</a><br>
<!-- 表单中action的URL地址写法,与超链接方式完全相同(可以用相对路径也可用绝对路径) -->
<!-- 通过index.jsp页面访问TestServlet,然后跳转到test.jsp -->
<a href="servlet/TestServlet">访问TestServlet</a><br>
</body>
通过index.jsp页面访问TestServlet,然后跳转到test.jsp
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//不行哦,请求重定向方式跳转到test.jsp,在当前路径下寻找test.jsp,
//而当前路径是MServlet_PathDorection/servlet/TestServlet
//response.sendRedirect("test.jsp");
//不行哦,这个/表示服务器根目录
//response.sendRedirect("/test.jsp");
//可以的,..表示回到上层路径,然后再找test.jsp
//response.sendRedirect("../test.jsp");
//可以的,如果要用请求重定向的方法,那么必须获得上下文对象getContextPath()
//response.sendRedirect(request.getContextPath()+"/test.jsp");//可以
//同请求转发一样,不行
//request.getRequestDispatcher("test.jsp").forward(request, response);
//可以的,服务器内部跳转,这里的/表示项目的根目录(特别注意,这个和response.sendRedirect不同)
request.getRequestDispatcher("/test.jsp").forward(request, response);
//可以的,..表示回到上层路径,然后再找test.jsp
//request.getRequestDispatcher("../test.jsp").forward(request, response);
//不行哦,没有出现错误,但test.jsp页面没有出来。这是什么原因???
//request.getRequestDispatcher(request.getContextPath()+"/test.jsp");
}
8.servlet初始化参数的设置与获取
9. MVC与Model2
10. 阶段项目
使用MVC的Model2思想实现购物车功能
开发步骤
购物车类属性和方法分析(三个方法、两个属性)