文章目录


不见庐山真面目,只缘身在此山中

导论

这一部分讲的是基础,应用是很简单的,不一定把所有东西都记住,你首先需要的是了解,

复习

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("密码:&nbsp;<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,输出出来看看值有没有获取到;