文章目录
- 最后的练习
- 总结
不见庐山真面目,只缘身在此山中
导论
这一部分讲的是基础,应用是很简单的,不一定把所有东西都记住,你首先需要的是了解,
复习
Tomcat的解压后bin—startup.bat//linux—.sh-----------PS:测试要会写简单的shell脚本
Servlet狭义
实现了servlet接口的java程序
功能:处理请求,返回响应
Servlet是什么?
实现了Servlet接口,运行在服务器端的的JAVA程序。
功能:处理请求,返回响应
abstract class HttpServlet extends GenericServlet
抽象类,实现了service(),提供了受保护的service(),这个受保护的service(),根据http请求方法不同(get,post)调用不同的do**()
abstract class GenericServlet implements Servlet, ServletConfig,
Servlet 是接口,5个抽象方法,如下
- void init(ServletConfig config)
- service(ServletRequest req, ServletResponse res)
- void destroy();
- ServletConfig getServletConfig();
- String getServletInfo();
Servlet使用
1)创建类实现Servlet接口
2) 重写service()
3)在WebContent下的WEB-INF下的web.xml进行配置
HttpServlet被创建的目的也包括简化Servlet的使用
1)创建类继承HttpServlet
2) 重写doGet doPost doPost的使用比较多
3)在WebContent下的WEB-INF下的web.xml进行配置
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
res.setContentType("text/html;charset=utf-8"); //将页面设置为中文
PrintWriter writer = res.getWriter();
//面试时可能会问的!
writer.write("hellow");
writer.print("hello1");//多加了一个判断是否为空
//print 调用了write
//println
writer.println("hello2");//除了换行符多加了锁,线程安全
writer.append();//调用类型是write;返回PrintWriter
}
//我们只用这个
writer.println("hello2");
使用
1.创建Servlet
2.重写方法
3.目录WebContent下的web.xml进行配置
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ;xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>ch03-servlet</display-name>
xsi:schemaLocation中间加一个“ ;“就不会卡顿!!!
配置方式三种
1)精确匹配
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>ch04.Servlet1</servlet-class>//包名 + “ . ” + 类名
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
2)模糊匹配 /目录/* 例如 /first/1
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/first/*</url-pattern>
</servlet-mapping>
3)模糊匹配 前面没有/ 例如访问使用 /a.do
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>ch04.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
HTTP响应码 :报错时要知道出现了什么问题
1 消息
▪ 100 Continue
▪ 101 Switching Protocols
▪ 102 Processing
2 成功
▪ 200 OK
▪ 201 Created
▪ 202 Accepted
▪ 203 Non-Authoritative Information
▪ 204 No Content
▪ 205 Reset Content
▪ 206 Partial Content
▪ 207 Multi-Status
3 重定向
▪ 300 Multiple Choices
▪ 301 Moved Permanently
▪ 302 Move Temporarily
▪ 303 See Other
▪ 304 Not Modified
▪ 305 Use Proxy
▪ 306 Switch Proxy
▪ 307 Temporary Redirect
4 请求错误
▪ 400 Bad Request
▪ 401 Unauthorized
▪ 402 Payment Required
▪ 403 Forbidden
▪ 404 Not Found
▪ 405 Method Not Allowed
▪ 406 Not Acceptable
▪ 407 Proxy Authentication Required
▪ 408 Request Timeout
▪ 409 Conflict
▪ 410 Gone
▪ 411 Length Required
▪ 412 Precondition Failed
▪ 413 Request Entity Too Large
▪ 414 Request-URI Too Long
▪ 415 Unsupported Media Type
▪ 416 Requested Range Not Satisfiable
▪ 417 Expectation Failed
▪ 418 I'm a teapot
▪ 421Misdirected Request
▪ 422 Unprocessable Entity
▪ 423 Locked
▪ 424 Failed Dependency
▪ 425 Too Early
▪ 426 Upgrade Required
▪ 449 Retry With
▪ 451 Unavailable For Legal Reasons
5 服务器错误
▪ 500 Internal Server Error
▪ 501 Not Implemented
▪ 502 Bad Gateway
▪ 503 Service Unavailable
▪ 504 Gateway Timeout
▪ 505 HTTP Version Not Supported
▪ 506 Variant Also Negotiates
▪ 507 Insufficient Storage
▪ 509 Bandwidth Limit Exceeded
▪ 510 Not Extended
▪ 600 Unparseable Response Headers
###HttpServlet
继承了GenericServlet
由service()方法根据提交方式不同执行doGet()或doPost()方法
HttpServlet中有两个Service()方法,HttpServlet中两个service()方法的区别:
public void service(ServletRequest arg0, ServletResponse arg1)
protected void service(HttpServletRequestarg0,HttpServletResponse arg1)
你是不是看懵了?这个是干啥用的???请有点大局观念,不见庐山真面目,只缘身在此山中
Request对象
作用:封装了当前请求的信息,由tomcat服务器创建并销毁的。作为实参传递给serviceu()
get请求的参数可以通过链接或者form方式传递参数
<a href="fourth?user_id=10&user_info=tom" >点击</a>
<form action="fourth" method="get">
<input type="text" name="user_name"/>
</form>
post请求传参,通过form表单
<form action="fourth" method="post">
<input type="text" name="user_name"/>
</form>
//1、获取请求行数据
System.out.println(request.getMethod());
System.out.println(request.getRequestURI());
System.out.println(request.getRequestURL());
System.out.println(request.getScheme());
// 2、获取请求头信息
Enumeration<String> e=request.getHeaderNames();
while(e.hasMoreElements()) {
String key=e.nextElement();
String value=request.getHeader(key);
System.out.println(key+":"+value);
}
System.out.println(request.getRemoteHost());
// 3、获取用户参数
String user_id= request.getParameter("user_id");
String user_info=request.getParameter("user_info");
PrintWriter out=response.getWriter();
out.println(user_id+":"+user_info);
}
Response对象
// 1、设置响应头
response.setHeader("header1", "lihuanzhen");
// 2、设置响应状态,HTTP状态码
// response.sendError(500);
response.setStatus(200);
// 3、设置响应类型
response.setContentType("text/html;charset=utf-8");
// 4、设置响应体
response.getWriter().println("你好!");
请求转发与请求重定向
Servlet中请求数据的传递、请求转发与请求重定向
举个例子:我、小明、老师
场景1:我去找小明借书,小明知道老师有书,小明向老师借书给我
场景2:小明告诉我老师有书,我向老师借书
这就类似请求转发,在服务器中进行比告诉用户去找哪个服务器,用户再次访问服务器要快。
请求转发是一次请求,参数是可以共享的,URL地址是不变化的,跳转发生在服务器端,速度快
request.getRequestDispatcher("targetURL").forward(request, response);//请求转发
response.sendRedirect("targetURL");//请求重定向
request.setAttribute(String,Object);//请求数据的传递
request.setAttribute("msg", "恭喜你登录成功了!");//请求数据的传递
request.getRequestDispatcher("forward").forward(request,response);//请求转发
请求重定向,是两次请求,参数是不共享的,URL地址是变化的,跳转发生在客户端,速度慢
request.setAttribute("msg", "恭喜你登录成功了!");
response.sendRedirect("redirect");
Attribute参数
setAttribute() :设置参数
getAttribute() :获取某个参数的值
请求转发、请求重定向区别
-本质
请求转发:一次请求;请求重定向:两次请求
-速度
请求转发 > 请求重定向
-Attribute参数
请求转发可共享参数
请求重定向不可共享参数
-地址栏 - 请求转发,不变;请求重定向,变
数据共享
一.重定向
1.发送数据
request.setAttribute("request_name", "request_value");
response.sendRedirect("接受的url?request_name=request_value ");
2.接收数据
String request_name=(String)request.getAttribute("request_name");
二.请求转发
1.发送数据
request.getRequestDispatcher("接受的url").forward(request, response);
2.接收数据
String request_name=(String)request.getAttribute("request_name");
三.Servlet-Context技术
1.在web.xml中配置
<context-param>
<param-name>request_name</param-name>
<param-value>request_value </param-value>
</context-param>
2.获取数据
String value=this.getServletContext().getInitParameter("request_name");
四.Servlet-Init技术
(与第三种相区别:context 为全局变量,而init是两个servlet间的共享)
A.共享单个数据
1.在web.xml中配置
<init-param>
<param-name>request_name</param-name>
<param-value>request_value</param-value>
</init-param>
2.获取数据
ServletConfig servletConfig =this.getServletConfig();
String value=servletConfig.getInitParameter("request_name");
B.共享多个数据
1.在web.xml中配置
配置多组<init-param></init-param>键值对
2.获取数据
Enumeration params=this.getServletConfig().getInitParameterNames();
while(params.hasMoreElements()) {
String name=params.nextElement().toString();
String value=this.getServletConfig().getInitParameter(name);
五.获取参数(用户在登录界面输入的信息实现共享)
1.传输数据
PrintWriter out=response.getWriter();
out.println("<form action='url' method='post'>");
out.println("用户名:<input type=text name=username ><br />");
out.println("密码: <input type=password name=password ><br />");
out.println("<input type=submit value=登录><br /><br />");
2.接收数据
String username=request.getParameter("username");
最后的练习
login.html 输入用户名,密码post请求
发送给LoginServlet.java /login
1)判断用户名、密码admin 123456
如果正确,请求转发UserinfoServlet.java /user
request.setAttribute(“msg”,“恭喜你登录成功了!”);
2)如果错误
UserRegisterServlet.java
System.out.println(“请注册”);
package com;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import service.UserService;
/**
* Servlet implementation class LoginServlet
*/
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String loginName=request.getParameter("loginName");
String password = request.getParameter("password");
System.out.println(loginName);
System.out.println(password);
boolean result = new UserService().login(loginName,password);
if(result) {
// request.setAttribute("username", loginName);
// RequestDispatcher rd = request.getRequestDispatcher("user");
// rd.forward(request, response);
response.sendRedirect("home.html");
}else {
request.setAttribute("errorInfo", "您的账号密码错误,请重试。");
// request.getRequestDispatcher("index.jsp").forward(request, response);
response.sendRedirect("login.html");
}
}
}
package service;
public class UserService {
public boolean login(String loginName, String password) {
if("admin".equals(loginName) && "123".equals(password)) {
return true;
}else {
return false;
}
}
}
总结
如果你看了很多遍后,感到很迷茫?
1.出错,看配置文件出问题了吗?一定要细心,不要打错名字,找到web.xml和java文件的对应关系,比如form 中action对应Servlet的配置URL的别名。
2.搞清配置文件中的设置和Servlet的对应关系;
3.学会debug,输出出来看看值有没有获取到;
t.getRequestDispatcher(“index.jsp”).forward(request, response);
response.sendRedirect(“login.html”);
}
}
}
package service;
public class UserService {
public boolean login(String loginName, String password) {
if(“admin”.equals(loginName) && “123”.equals(password)) {
return true;
}else {
return false;
}
}
}
# 总结
如果你看了很多遍后,感到很迷茫?
1.出错,看配置文件出问题了吗?一定要细心,不要打错名字,找到web.xml和java文件的对应关系,比如form 中action对应Servlet的配置URL的别名。
2.搞清配置文件中的设置和Servlet的对应关系;
3.学会debug,输出出来看看值有没有获取到;