Web-第八天 Servlet学习
今日内容介绍
今日内容学习目标
在网站的首页上,登录的链接,点击登录的链接,可以跳转到登录的页面.在登录的页面中输入用户名和密码点击登录的案例.完成登录的功能.
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态资源。
Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),且最重要。
用来处理从客户端发送过来的请求,并对该请求作出响应。
Servlet的任务有:
1. 获取请求数据
2. 处理请求
3. 完成响应
Servlet规范要求:Servlet程序需要编写实现类,并在web.xml进行配置。
配置信息:在web.xml进行配置。
作者:北京外国语大学阿拉伯语系《阿拉伯语实用口语》编写组 编
当当 广告
购买
1. 创建类,继承HttpServlet,复写doGet和doPost方法
package cn.com.javahelp.demo01.a_servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("get请求将执行");
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("post请求将执行");
}
}
2. 编写配置文件
<!-- demo01 servlet hello start
* <servlet> 注册servlet
<servlet-name> servlet名称,当前xml中唯一
<servlet-class> servlet实现类的全限定类名
* <servlet-mapping> 给注册的servlet添加映射路径
<servlet-name> 已经注册的servlet名称。注意:必须与注册的名称一致。
<url-pattern> 访问路径。要求:必须/开头
-->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>cn.com.javahelp.demo01.a_servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- demo01 servlet hello end -->
3. 浏览器访问
在浏览器地址栏输入:http://localhost:8080/day13/hello
请求参数
方法名 | 描述 |
---|---|
String getParameter(String name) | 获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。例如:username=jack |
1. 编写表单,提供表单字段:username、password、hobby,以post方式提交
<form action="../demo01ParamServlet" method="post">
用户名:<input type="text" name="username" value="jack" /> <br/>
密码:<input type="text" name="password" value="1234" /> <br/>
爱好:<input type="checkbox" name="hobby" value="抽烟" checked="checked"/> 抽烟
<input type="checkbox" name="hobby" value="喝酒" checked="checked" /> 喝酒
<input type="checkbox" name="hobby" value="烫头" /> 烫头 <br/>
<input type="submit" value="post提交" />
</form>
2. 编写Servlet实现类,使用对应方法获得请求参数,并处理POST中文乱码。
public class Demo01ParamServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//0请求参数中文乱码
request.setCharacterEncoding("UTF-8");
//1 使用参数名获得一个值
//1.1 获得用户名
String username = request.getParameter("username");
//1.2 获得密码
String password = request.getParameter("password");
System.out.println(username + " : " + password);
//2 使用参数名获得一组值
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
//3 获得所有数据,遍历Map
System.out.println("---------------");
Map<String,String[]> allData = request.getParameterMap();
for (Map.Entry<String, String[]> entry : allData.entrySet()) {
System.out.print(entry.getKey());
System.out.print( " --> ");
System.out.println(Arrays.toString(entry.getValue()));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* 开发中我们发现,doPost和doGet两个方法编写的内容相同
* 所以常使用一个调用另一个,此处我们使用doPost调用doGet
* 所有的内容之后都编写doGet方法中
*/
doGet(request, response);
}
}
3. 编写Servlet,配置文件
<servlet>
<servlet-name>Demo01ParamServlet</servlet-name>
<servlet-class>cn.com.javahelp.demo01.b_request.Demo01ParamServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo01ParamServlet</servlet-name>
<url-pattern>/demo01ParamServlet</url-pattern>
</servlet-mapping>
4. 测试,访问“http://localhost:8080/day13/02.request/form.html”,并提交表单。控制台显示
Servlet的代码
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// 1.接收表单提交的参数.
String username = request.getParameter("username");
String password = request.getParameter("password");
// 2.封装到实体对象中.
User user = new User();
user.setUsername(username);
user.setPassword(password);
// 3.调用业务层处理数据.
UserService userService = new UserService();
User existUser = userService.login(user);
// 4.根据处理结果显示信息(页面跳转).
if(existUser == null){
// 登录失败
response.getWriter().println("Login Fail...");
}else{
// 登录成功
response.getWriter().println("Login Success...");
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Service的代码:
public class UserService {
/**
* 业务层用户登录的方法:
* @param user
* @return
* @throws SQLException
*/
public User login(User user) throws SQLException {
// 调用DAO完成对数据库查询的操作:
UserDao userDao = new UserDao();
return userDao.login(user);
}
}
DAO的代码
public class UserDao {
/**
* 用户登录的DAO的方法:
* @param user
* @return
* @throws SQLException
*/
public User login(User user) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select * from user where username =? and password = ?";
User existUser = queryRunner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword());
return existUser;
}
}
1.第一次调用时,将执行初始化方法:init(ServletConfig)
2.每一次调用,都将执行service(ServletRequest,ServletResponse)方法
3.服务器关闭,或项目移除:destroy()方法
request.getMethod() 获得请求方式(get、post)
如果是get,将调用doGet()
如果是post,将调用doPost()
1. 用户第一次访问Servlet的时候,首先服务器会创建一个Servlet的实例
2. 创建servlet实例同时执行Servlet的init方法。
3. 然后,每一次请求服务器都会创建一个新的线程访问Servlet中的service的方法,在service方法内部根据请求的方式的不同调用doXxx的方法(get请求调用doGet,post请求调用doPost)。
4. 当Servlet从服务器中被移除,或者关闭服务器,Servlet的实例就会被销毁,同时destroy方法将会执行。
Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:
* <load-on-startup>2</load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高.
url-pattern配置方式共有三种:
1.完全路径匹配 :以 / 开始
例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
2.目录匹配 :以 / 开始 需要以 * 结束.
例如: /* (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*
3.扩展名匹配 :不能以 / 开始 以 * 开始的. 例如: *.do , *.action 、*.jsp 、*.jpg
***** 错误的写法 : /*.do
4.缺省路径 /
通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet
tomcat获得匹配路径时,优先级顺序:1 > 2 > 3 > 4
有如下的配置:
<servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>cn.com.javahelp.a_servlet.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/ServletDemo4</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>cn.com.javahelp.a_servlet.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletDemo6</servlet-name>
<servlet-class>cn.com.javahelp.a_servlet.ServletDemo6</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo6</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如果访问地址:
http://localhost:8080/day13/ServletDemo4 :第一个
http://localhost:8080/day13/aaa.do :第二个
***** 完全路径匹配 > 目录匹配 > 扩展名匹配
* ./ 当前路径 ../上一级目录
* 使用相对路径访问:
* http://localhost:8080/day13/demo4-url/demo1.html
* http://localhost:8080/day13/ServletDemo6
* 绝对路径中分为客户端路径和服务器端路径:
* 客户端路径一定要加工程名. /day13/ServletDemo6
* 服务器端路径不需要加工程名. /ServletDemo6
方法名 | 返回值类型 | 描述 |
---|---|---|
getInitParameter(name) | String | 获得Servlet的初始化参数的 |
getInitParameterNames() | Enumeration | 获得所有Servlet的初始化参数的名称 |
getServletContext() | ServletContext | 获得ServletContext对象的引用 |
getServletName() | String | 获得Servlet在web.xml中配置的name的值。及<servlet-name>标签配置内容。 |