1.使用套接字实现web服务器功能
/**
* 利用套接字技术模仿一个web服务器
*/
public static void main(String[] args)throws Exception {
ServerSocket listener = new ServerSocket(8080);
Socket accept = listener.accept();
OutputStream os = accept.getOutputStream();
FileInputStream fis = new FileInputStream("src\\Demo.html");
byte[] b = new byte[1024*4];
int len = 0;
while((len=fis.read(b))!=-1){
os.write(b);
os.flush();
}
os.close();
fis.close();
accept.close();
listener.close();
}
2.常见的几种网络状态
3.自定义Servlet
public class MyServlet implements Servlet {
//继承Servlet接口,重写其方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("服务正常启动");
int a = 10/0;
servletResponse.getWriter().write("成功访问");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web-xml的相关配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置可以创建多个Servlet容器-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.qf.servlet.MyServlet</servlet-class>
<!--servlet参数-->
<init-param>
<param-name>username</param-name>
<param-value>zhuxi</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>20</param-value>
</init-param>
<!--serlet加载时机:(1)第一次访问Servlet时创建 (默认) (2)启动Tomcat时创建-->
<!--默认值-1 表示第一次访问时创建-->
<!-->=0 启动Tomcat时创建 数字越小优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
//配置一些初始的参数
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.qf.servlet.MyServlet2</servlet-class>
<init-param>
<param-name>address</param-name>
<param-value>北京</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>MyServlet3</servlet-name>
<servlet-class>com.qf.servlet.MyServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<!--访问地址配置-->
<!--1 精确匹配 /xxx-->
<!--2 后缀匹配 *.do *.action *表示所有字符-->
<!--3 /* 匹配所得的请求 -->
<!--4 / 匹配所得的请求 ,不包括jsp-->
<!--其他写法
/aaa/bbb/* 匹配 /aaa/bbb开头的地址
/aaa/*/bbb 匹配/aaa/*/bbb 精确匹配
-->
<url-pattern>/myservlet</url-pattern>
<url-pattern>/aaa/*/bbb</url-pattern>
<!--常见错误
1 地址不能重复
2 精确匹配和后缀匹配不能一起使用,不能以/开头 ,*.xxx结尾
3 不写/也不使用后缀匹配。Invalid <url-pattern> [myservlet2] in servlet mapping
-->
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/myservlet2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet3</servlet-name>
<url-pattern>/myservlet3</url-pattern>
</servlet-mapping>
</web-app>
4.Servlet还可以通过继承 HttpServlet来创建
//只需要重写doPost doGet 两种方法就可以实现
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了"+"doPost");
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了"+"doget");
ServletConfig sc = getServletConfig();
String httpname = sc.getInitParameter("httpname");
System.out.println(httpname);
}
5.Servlet的生命周期(运行原理)以及注意事项
1.在第一次运行的时候进行实例化,然后进行初始化(这里两个步骤在整个Servlet阶段只执行一次);然后进入服务阶段,直到容器停止或者重新启动时,进行销毁。
2.由于Servlet有可能被多个客户同时访问,如果有的线程会对方法内部的成员变量修改,就有可能会造成线程安全问题。可以通过使用局部变量和加锁来避免减少这种状况
6.关于requset和response的基本应用
//解决请求中的乱码问题
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);
String accept = request.getHeader("Accept");
System.out.println(accept);
String method = request.getMethod();
System.out.println(method);
String requestURI = request.getRequestURI();
System.out.println(requestURI);
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
/* String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}*/
//服务器的响应
//解决相应中的乱码问题
//response.setContentType("text/html;charset=utf-8");
response.setHeader("Content-Type","text/html;charset=utf-8");
response.getWriter().write("<h1>我是哈哈</h1>");
7.转发与重定向
转发是由服务器的行为,转发不会丢失数据;
重定向是客户端的行为,会发生数据丢失。
@WebServlet(name="RegisterServlet",value = "/regist",loadOnStartup = 0)
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost执行");
//转发与重定向
//首先解决编码的乱码问题
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
if(username.equals("admin") && pwd.equals("888")){
//RequestDispatcher requestDispatcher = request.getRequestDispatcher("Welcome.html");
//requestDispatcher.forward(request,response);
//简写
request.getRequestDispatcher("Welcome.html").forward(request,response);
}else{
//重定向
response.sendRedirect("Register.html");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
8.Cookie的应用
创建与配置Cookie
public class cookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("username","yangxiaopeng");
Cookie cookie2 = new Cookie("address","北京");
//设置路径
cookie.setPath("/");
//设置存活时间
cookie.setMaxAge(60*60*24);
//设置setHttpOnly
cookie.setHttpOnly(true);
//服务器添加cookie
response.addCookie(cookie);
response.addCookie(cookie2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
读取Cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+"==="+cookie.getValue());
}
}
Cookie的修改与删除
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookies = new Cookie("username", "lisa");
cookies.setPath("/");
//更新Cookie必须是的name属性和setPath与修改的Cookie保持一致
//删除操作,另存活周期为0就是删除操作(-1浏览器关闭时删除)(0直接删除)(>0 表示设置的存活时间,单位为秒)
//cookies.setMaxAge(0);
response.addCookie(cookies);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
9.Session的应用
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//获取属性
System.out.println("ID"+session.getId());
//session.getMaxInactiveInterval()是获得session的最大存活时间,默认是1800秒!就是说你不动浏览器,在三十分钟后它会自动消毁!
//这个有效期是指最后一次访问时间开始计算
System.out.println("存活时间"+session.getMaxInactiveInterval());
//修改属性
//session.setMaxInactiveInterval(60*10);
//不过推荐使用在web-xml文档中修改数据
//获取创建时间
System.out.println("创建时间"+new Date(session.getCreationTime()).toLocaleString());
//获取最后一次访问时间(上一次的访问时间)
System.out.println("最后一次的访问时间"+new Date(session.getLastAccessedTime()).toInstant());
//手动设置session失效
//session.invalidate();
/* //设置数据
session.setAttribute("username","张三");
//得到数据
String username =(String) session.getAttribute("username");
//移除数据
session.removeAttribute("username");*/
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
10.验证码的应用
@WebServlet(name = "ImageCodeServlet",value = "/imagecode")
public class ImageCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//ValidateCode(100, 30, 4, 20)100表示图形验证框的宽度,30表示高度,4表示需要验证的位数
//20表示模糊程度
ValidateCode validateCode = new ValidateCode(100, 30, 4, 20);
HttpSession session = request.getSession();
session.setAttribute("code",validateCode.getCode());
//以图形的方式输出
validateCode.write(response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
11.防止Cookie禁用
public class ReWriteURLServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
HttpSession session = request.getSession();
//encodeRedirectURL当用户设置禁止Cookie的时候在用户第一次访问的时候追加一个session
//之后每次刷新就不在此重写url,除非关闭或使用不同的浏览器访问(每次生成的都是不同的session)
String url = response.encodeRedirectURL("index");
writer.write("<a href='"+url+"'>查询界面</a>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
12.ServletContext
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext appliction = getServletContext();
String path = appliction.getRealPath("/img/index.jpg");
FileInputStream fis = new FileInputStream(path);
byte[] b = new byte[1024];
int len = 0;
ServletOutputStream os = response.getOutputStream();
//ServletContext服务器的全局容器
//通过这个容器可以实现文件加载的功能
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode("哈哈.jpg","utf-8"));
while((len=fis.read(b))!=-1){
os.write(b,0,len);
}
//关闭
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}