请求行:
请求方式,请求的地址和参数
public class LineServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、获得请求方式
String method = request.getMethod();
System.out.println("method:"+method);
//2、获得请求的资源相关的内容
String requestURI = request.getRequestURI();//客户端地址
StringBuffer requestURL = request.getRequestURL();//有http的地址
System.out.println("uri:"+requestURI);
System.out.println("url:"+requestURL);
//获得web应用的名称
String contextPath = request.getContextPath();//获得项目名
System.out.println("web应用:"+contextPath);
//地址后的参数的字符串
String queryString = request.getQueryString();
System.out.println(queryString);
//3、获得客户机的信息---获得访问者IP地址
String remoteAddr = request.getRemoteAddr();//客户端的地址
System.out.println("IP:"+remoteAddr);//为什么获得是
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
总结:
url与URI的区别:
Stringbuffer与string的区别:有点像数组和集合的关系
String的特点是一旦赋值,便不能更改其指向的字符对象,如果更改,则会指向一个新的字符对象
StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作(.append())
转化:一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象
请求头:
键值对的形式:存储了客户端和请求的一些基本信息
package com.ithiema.header;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HeaderServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、获得指定的头
String header = request.getHeader("User-Agent");//获得某个键对应的值。(用户使用的浏览器的类型)
System.out.println(header);
//2、获得所有的头的名称
Enumeration<String> headerNames = request.getHeaderNames();//获得 n个键名,放回一个Enumeration<String>类型的数据
while(headerNames.hasMoreElements()){//.hasMoreElements()返回的是布尔类型的数据
String headerName = headerNames.nextElement();//获得键
String headerValue = request.getHeader(headerName);//获得值
System.out.println(headerName+":"+headerValue);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
总结:
Enumeration接口中定义了一些方法,通过这些方法可以枚举(一次获得一个)对象集合中的元素。(是一个迭代器)Interotar
有点像集合用于存储对象的。只是获取对象的方式有点不一样(集合是通过遍历)常用的方法,hasMoreElements(),.nextElement()
package com.ithiema.header;
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 RefererServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//对该新闻的来源的进行判断
String header = request.getHeader("referer");
if(header!=null&&header.startsWith("http://localhost")){
//是从我自己的网站跳转过来的 可以看新闻
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("中国确实已经拿到100块金牌....");
}else{
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("你是盗链者,可耻!!");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
String对象常用的方法:equals("字符串"):是否与某个字符串一样。startwith(字符串)以某个字符串开头
response.setContentType("text/html;charset=utf-8");
response.setHeader("refresh", "5;http://www.baidu.com");当一个字符串的位置要传入多个有用的参数的的时候就用; 分开来
if()括号后面没有;加了会报错
域对象:
转发:
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", "tom");
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从request域中取出数据
Object attribute = request.getAttribute("name");//getAttribute是获取域中的内容
response.getWriter().write("hello haohao..."+attribute);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
请求体:
public class ContentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、获得单个表单值
String username = request.getParameter("username");//getParameter是获取体中的内容
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
//2、获得多个表单的值
String[] hobbys = request.getParameterValues("hobby");
for(String hobby:hobbys){
System.out.println(hobby);
}
//3、获得所有的请求参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
System.out.println(parameterNames.nextElement());
}
System.out.println("------------------");
//4、获得所有的参数 参数封装到一个Map<String,String[]>
Map<String, String[]> parameterMap = request.getParameterMap();
for(Map.Entry<String, String[]> entry:parameterMap.entrySet()){//map集合的遍历方式就是这样的
System.out.println(entry.getKey());
for(String str:entry.getValue()){
System.out.println(str);
}
System.out.println("---------------------------");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
总结:
Map.Entry<String, String[]> entry:
map.entrySet()是将map里的每一个键值对取出来封装成一个Entry对象在存到一个Set里面。
Map.Entry<String, String[]>的意思是一个泛型,
表示Entry里装的是两个string的字符串,分别是allrecordmap的key和value
打断点调试:F8是调到下一个断点(没有的话,直接运行到结束
F5是单步调试进入函数内部。
F6是单步调试不进入函数内部。
F7是由函数内部返回到调用处。
案例demo:
登录:
package com.ithiema.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.ithiema.register.User;
import com.ithiema.utils.DataSourceUtils;
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//1、获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2、调用一个业务方法进行该用户查询
User login = null;
try {
login = login(username,password);
} catch (SQLException e) {
e.printStackTrace();
}
//3、通过user是否为null判断用户名和密码是否正确
if(login!=null){
//用户名和密码正确
//登录成功 跳转到网站的首页
response.sendRedirect(request.getContextPath());
}else{
//用户名或密码错误
//跳回当前login.jsp
//使用转发 转发到login.jsp 向request域中存储错误信息
request.setAttribute("loginInfo", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
public User login(String username,String password) throws SQLException{
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user04 where uname=? and upassword=?";
User user = runner.query(sql, new BeanHandler<User>(User.class), username,password);
return user;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
总结:一般出现404 可能的原因:代码的问题, 配置文件的原因。跳转的服务器地址 或客户端地址写错
注册:
package com.ithiema.register;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.QueryRunner;
import com.ithiema.utils.DataSourceUtils;
public class RegisterServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置request的编码---只适合post方式
request.setCharacterEncoding("UTF-8");
//get方式乱码解决
//String username = request.getParameter("username");//乱码 如果参数比较多怎么办??
//先用iso8859-1编码 在使用utf-8解码
//username = new String(username.getBytes("iso8859-1"),"UTF-8");
//1、获取数据
//String username = request.getParameter("username");//当请求体中的元素很少时。用这种
//System.out.println(username);
//String password = request.getParameter("password");
//.....
//2、将散装的封装到javaBean
//User user = new User();
//user.setUsername(username);
//user.setPassword(password);
//使用BeanUtils进行自动映射封装
//BeanUtils工作原理:将map中的数据 根据key与实体的属性的对应关系封装
//只要key的名字与实体的属性 的名字一样 就自动封装到实体中(名字要确定一样才会被自动赋值)
Map<String, String[]> properties = request.getParameterMap();//凡是用了这个的方法都要进行封装。请求体比较多时用这种
User user = new User();//对象中的字段和User要一样才可以进行封装,封装不了的手动封装
try {
BeanUtils.populate(user, properties);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//现在这个位置 user对象已经封装好了
//手动封装uid----uuid---随机不重复的字符串32位--java代码生成后是36位
user.setUid(UUID.randomUUID().toString());
//3、将参数传递给一个业务操作方法
try {
regist(user);
} catch (SQLException e) {
e.printStackTrace();
}
//4、认为注册成功跳转到登录页面
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
//注册的方法
public void regist(User user) throws SQLException{
//操作数据库
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "insert into user values(?,?,?,?,?,?,?)"; //以数据库中的表为标准
int row=r
/*System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getBirthday());
System.out.println(user.getSex());*/
if(row>0)
{
System.out.println("注册成功");
}
else{
System.out.println("注册失败");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
总结:一般问题汇总:404 跳转的问题(服务器地址客户端地址有没有写错,还有配置文件) 500(【配置文件),代码问题,,sql语句有问题