Servlet其实就是客户端和服务器之间的翻译官,请求的大致过程模拟:
1.服务器获取http请求及资源
2.创建一个Servlet对象,同时在创建的过程中进行initialize
3.调用Servlet中的service方法,创建HttpRequest和HttpResponse对象
4.服务器关闭的时候销毁Servlet对象
1.ServletConfig
作用:可以从配置文件中获取某些特定的初始化参数
web.xml代码
<servlet>
<description></description>
<display-name>MyConfig</display-name>
<servlet-name>MyConfig</servlet-name>
<servlet-class>com.itcased.servletconfig.MyConfig</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>hello</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyConfig</servlet-name>
<url-pattern>/myconfig</url-pattern>
</servlet-mapping>
注意:init-para标签只能在最后插入,不然会报错
Java代码
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(config.getInitParameter("user"));
}
Servlet配置的标准格式
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.itcased.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/Urlabc</url-pattern>
</servlet-mapping>
url-pattern的三种匹配方式 1完全匹配 2目录匹配 3扩展名匹配
缺省Servlet:如果/1.html在自己的web.xml配置文件中没有找到,那么就去缺省/中找,如果找到了匹配的静态资源,然后返回该对象。
2.ServletContext
web应用的上下文对象,只有一个。
获取ServletContext对象的方法:this.getServletContext()
两个常用的作用:
1.获取绝对路径的两种方式:
1.context.getRealPath(para) 参数是相对于web-content的路径
2.this.class.getClassLoader().getResource(para).getPath() 参数是相对于classes文件的路径
2.ServletContex是一个域对象
context.setAttribute(key,object)
来进行对象的存储
getAttribute(key)
来进行对象的取出
removeAttribute(key)
进行对象的移除
forexp:记录登录的人数并且完成用户的登录次数统计
package com.itcased.login;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.itcased.domain.User;
import com.itcased.utils.DataSourceUtil;
public class Login2 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
//初始化时候设置一个count对象
int count=0;
this.getServletContext().setAttribute("count", count);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.通过数据库来实现验证
//response.getWriter().write(username);
QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
String sql="select * from user where username=? and password=?";
User user=null;
try {
user = qr.query(sql, new BeanHandler<User>(User.class), username,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user!=null){
response.getWriter().write("congratulations");
Integer count=(Integer) this.getServletContext().getAttribute("count");
count=count+1;
this.getServletContext().setAttribute("count", count);
response.getWriter().write("当前登录次数为"+count);
}else{
response.getWriter().write("sorry");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注意:doGet和doPost根据当前页面的提交方式来执行响应的方法
3.HttpRequest对象
3.1获取网络连接信息
//获取http中的请求方式
System.out.println(request.getMethod());
//获取http中的虚拟路径
System.out.println(request.getRequestURI());
//获取请求资源所属web应用的路径
System.out.println(request.getContextPath());
//获取客户端的ip地址
System.out.println(request.getRemoteAddr());
3.2获取请求头信息
//获取请求头某个信息
System.out.println(request.getHeader("User-Agent"));
//获取请求头的所有信息
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String nextElement = headerNames.nextElement();
String header = request.getHeader(nextElement);
System.out.println(nextElement+"---"+header);
}
3.3获取请求参数
request.getParameter()
获取单一的参数
request.getParameterMaps()
获取所有的参数
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
for ( String st : entry.getValue()) {
response.getWriter().write(st);
}
}
3.4请求域属性
request.getResquestDispatcher("url").forword(request,response)
请求转发
注意和重定向的区别:重定向是两次请求,而请求转发是一次请求,HttpRequest里面数据可以共享,类似于全局变量。
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward");
requestDispatcher.forward(request, response);
4.HttpResponse对象
response.sendRedict(url)
重定向
response.getWriter()
获取响应对象的输出流 在那之前必须设置文本格式response.setContentType("text/html;charset=UTF-8")
完成文件下载
通过文件的mime类型去区分类型
5 完成的案例要求
1.用户的注册及登录功能
运用BeanUtils工具把map集合映射到user对象中去
Map<String, String[]> parameterMap = request.getParameterMap();
User2 user2=new User2();
try {
//运用组件进行
BeanUtils.populate(user2, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}