1 Servlet
1.1 Servlet概述
1.2 Servlet的作用
使用servlet可以对用于在浏览器端发出的请求做出相应的处理,并给出相应的结果;
1.3 Servlet的访问流程分析
1.4 Servlet的快捷创建方式
1:使用eclipse的模板直接创建servlet即可;(会自动在web.xml中完成servlet配置的过程)
参考代码:
public class MyServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理方案.....
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//为了保证将来浏览器无论发送什么请求(get或post),我们编写的doGet中的代码都会执行起来
doGet(request, response);
}
}
结论:
我们程序员自己写的doGet方法和doPost方法会被父类(HttpServlet)中的service方法调用。(servlet中的service方法是被tomcat服务器调用的)
1.5 Servlet中用户传递的参数的获取-request
request对象是由tomcat服务器创建的,且用户在浏览器每发出一次请求,服务都会创建一次对象,这个对象的数据类型是:HttpServletReqesut类型。
常用的获取参数的方法:
String getParameter(“属性名”);// 仅根据一个名字获取一个值使用
String[] getParameterValues(“属性名”);//根据一个名字获取一个数组值使用,例如: 爱好
Map
参考代码:
//1:获取一个名称的参数
request.setCharacterEncoding("utf-8");//解决post请求中的中文参数乱码问题;(对get无效)
String p = request.getParameter("username");
//2:获取一个数组
String[] values = request.getParameterValues("hobby");
//3:获取一个map集合
Map<String, String[]> map = request.getParameterMap();
System.out.println("一个参数:"+p);
System.out.println("一个数组:"+Arrays.toString(values));
Set<Entry<String,String[]>> set = map.entrySet();
for (Entry<String, String[]> en : set) {
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"====>"+Arrays.toString(value));
}
1.6 Servlet的生命周期问题(重要)
什么是生命周期?
从对象创建,到对象死亡中间经历的所有事情就是生命周期;
1:init方法,就是servlet对象创建时会被tomcat调用的方法。
(init方法仅会被调用一次,因为servlet对象是单例的,一个servlet类,tomcat仅会创建一个对象,且默认是在第一个用户访问的时候创建)
2:service方法
每一次用户访问这个地址的时候,tomcat都会调用一次这个方法。
3:destroy方法
当servlet对象被销毁的时候,tomcat会调用一次这个方法。
销毁的时机:
1:tomcat正常停止。(知道)
2:tomcat运行状态中,将工程移除。(了解)
参考代码:
@Override
public void init() throws ServletException {
super.init();
System.out.println("servlet被创建了:"+this);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet处理了一次请求:"+this);
}
@Override
public void destroy() {
super.destroy();
System.out.println("servlet被弄死了:"+this);
}
注意事项:
可以通过修改web.xml配置文件,让servlet随着tomcat的启动而创建。
代码:
<servlet>
<description></description>
<display-name>Life</display-name>
<servlet-name>Life</servlet-name>
<servlet-class>com.itheima.demo04_life.Life</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
关于数字值,建议写2以上的正整数,因为tomcat自己的servlet创建的优先级是1。
1.7 Servlet的访问路径
在servlet中关于路径匹配的配置方式有4种:
1:绝对匹配 (重点)
/xxx
2:目录匹配(通配符匹配)
/xxx/xxx/
3:后缀名匹配
.xxx
4:缺省匹配;(当访问的路径与上述的3种情况都不匹配的时候,才会执行缺省匹配)
/
如果多种路径同时匹配成功的时候,会按照优先级,优先选择最高的一个执行;
从大到小: 1>2>3>4
1.8 servletConfig对象(了解)
servletConfig代表的是servlet启动的时候在servlet中进行的参数配置的对象。
作用:
可以通过这个对象,读取web.xml中给servlet配置的参数信息。
使用前提:
事先在web.xml中配置参数:格式:
<servlet>
<description></description>
<display-name>MyConfig</display-name>
<servlet-name>MyConfig</servlet-name>
<servlet-class>com.itheima.demo06_config.MyConfig</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>jack</param-value>
</init-param>
</servlet>
API相关方法:
getInitParameter(“属性名”);
getInitParameterNames();
2 案例-用户登录案例
2.1 需求
2.2 分析
1:需要编写html页面;在页面中编写一个form表单
2:编写表单对应的servlet类;(类中的步骤,参考代码)
3:编写service和dao层代码;
(domain和数据库创建,jar包选择等)
2.3 流程分析示意图
2.5 参考代码
html
<form action="http://localhost/day30/LoginServlet" method="post">
用户名:<input type="text" name="username">
<br>
密 码:<input type="password" name="password">
<br>
<input type="submit" value="提交">
</form>
Web:(servlet)
/*
* 1:获取用户携带的参数;
2:调用service层传递参数,获取一个user对象;
3:判断,如果查询到了,则提示登录成功,否则登录失败
*/
//1:获取用户携带的参数;
String un = request.getParameter("username");
String ps = request.getParameter("password");
//2:调用service层传递参数,获取一个user对象;
UserService us = new UserService();
User u = us.findUserByUsernameAndPassword(un,ps);
//3:判断,如果查询到了,则提示登录成功,否则登录失败
response.setContentType("text/html;charset=utf-8");
if(u==null){
//登录失败
response.getWriter().println("亲,用户名或密码错误!");
}else{
response.getWriter().println("欢迎您:"+un);
}
Service:
//根据用户名和密码查询数据库对象
public User findUserByUsernameAndPassword(String un, String ps) {
return new UserDao().findUserByUsernameAndPassword(un,ps);
}
Dao层:
//根据用户名和密码查询数据库对象
public User findUserByUsernameAndPassword(String un, String ps) {
//1:创建sql执行者 QueryRunner
QueryRunner q = new QueryRunner(MyC3P0Utils.getDataSource());
//2:编写sql语句
String sql = "select * from user where username = ? and password = ?";
//3:准备参数与结果集
BeanHandler rsh = new BeanHandler(User.class);
//4:执行sql返回结果
try {
return q.query(sql, rsh,un,ps);
} catch (SQLException e) {
e.printStackTrace();
//万一出了异常,就抛出一个运行时期的异常,将程序停下来
throw new RuntimeException();
}
}
数据库: