javaweb第二季笔记【siki学院】

目录

jar包引入
pageContext对象
jspinclude
相对路径和绝对路径
单例模式
javaEE分层架构
el表达式
jstl表达式
JSON
Ajax
过滤器
过滤器解决中文乱码问题
权限管理过滤器
设置过滤器的请求类型
监听器Listener

jar包引入

jar包放到webcontent ->WEB-INF->lib下面
会自动识别jar包并放到libraries下。之前是右键->build path ->add to build path

  <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.xhtml</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

访问网页的默认首页,依次查找,直到找到存在的
 

pageContext对象
pageContext.getRequest();//ServletRequest
pageContext.getResponse();//ServletResponse
pageContext.getSession();//httpSession
pageContext.getServletContext();//ServletContext application对象


//域对象 page request session application
//setAttribute()方法的第三个参数可以选择对象存在的域
pageContext.setAttribute("user","oopsboom", PageContext.SESSION_SCOPE);
System.out.println(session.getAttribute("user"));

 

jspinclude
<jsp:include  page=" head.jsp"></jsp:include>

当前jsp页面包含了头部head.jsp页面
这样,方便代码的维护
 

相对路径和绝对路径

相对路径绝对路径
我们最好写绝对路径(之前学前端的时候老师都是用相对路径写,到了后端改为绝对路径!!!)
request.getContextPath()得到当前项目的路径

相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
绝对路径(absolute path)指带域名的文件的完整路径。

<!-- 相对路径css/style.css  相对于当前页面 但是当前页面可能是不确定的-->
<!-- 绝对路径/web04/css/style.css 相对于服务器根目录 <%=request.getContextPath() %>/css/style.css这种写法更合适,因为项目名随时可更改  -->
<!-- request.getContextPath()得到当前项目的路径 -->

客户端路径:需要客户端进行解析,显示在浏览器上的,使用绝对路径
服务器端路径:服务端解析,在浏览器不显示

不管是客户端还是服务器端的相对路径都是相对于当前访问路径来说
客户端绝对路径 http://localhost:8080
服务端绝对路径 http://localhost:8080/WebName
/ 开头绝对路径
 

相单例模式

看视频https://www.bilibili.com/video/BV1Vt411Q7jh?p=8
老师讲解的很棒!

 

javaEE分层架构

在这里插入图片描述

web service dao(database access object 数据库连接模型)

一般一个请求一个servlet
一个model对应一个dao

dao层都是和数据库 增删改查有关
service层 都是和业务处理 比如登录注册有关

先构造一个数据模型model下创建一个User类
我们模拟数据库,用创建一个DBUtil类模拟数据库
dao层 判断用户是否存在 是否添加用户成功
service层 userService处理注册功能 注册成功返回true
controller层 RegisterServlet处理注册后页面的跳转,注册成功 请求转发到login.jsp页面

servlet调service service调dao

model层 模拟商品类 Goods
创建模拟数据库model下 DBUtil类下模拟goods相关方法
dao层下 GoodsDao类下进行数据库商品查询
controller层 GoodsListServlet类进行商品列表查询
service层 GoodsService商品查询

loginServlet
如果管理员登录,请求转发到goods_list,而不是goods_list.jsp。request.getRequestDispatcher("/admin/goods_list").forward(request, response);
GoodsListServlet(goods_lsit)处理请求转发到 goods_list.jsp页面

请求从LoginServlet转发到GoodsListServlet用的是post方式,我们GoodsListServlet处理的时候要用doPost()方法。

改进:用重定向
LoginServlet:
如果是管理员
response.sendRedirect(request.getContextPath()+"/admin/goods_list"); //这个重定向不能写goods_list.jsp

 

el表达式

el表达式和jstl表达式的目的:
让jsp代码写起来更简洁优雅

<%--
if(request.getAttribute("msg")!=null)
	out.println(request.getAttribute("msg")+"<br/>");
--%>
//el表达式写为
 ${msg } <br>

<%
User u=new User("中国","123",90,"男",false);
request.setAttribute("user", u);

%> 
${user.username }  
<!-- 确保get方法存在 可以这样使用 -->
${user.password }


<%
  Map<String,String>map=new HashMap<String,String>();
  map.put("name", "李四");
  map.put("age","12");
   request.setAttribute("map",map);
%>
${map.name }
${map.age }

el表达式不能放到java代码部分,放到jsp部分
el表达式只能用来取值

 

jstl表达式

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
我们要使用jstl,首先要去下载jstl的jar包。
网上下载好的jar包复制一份到WEB-INF下的lib文件夹下,JavaResource->librarier->WebAppLibraries可查看到引入的jar包

jsp内置标签
<jsp: include page=" "></jsp:include> 这样的标签
 

html标签
jsp内置标签
jstl引入的标签库

引入jstl标签库

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

prefix前缀 为了区别不同的标签类型

1.引入jar包
2.引入jstl

<!-- request.setAttribute("username","sikiedu");相当于 -->
<!-- 存储数据 -->
<c:set var="username" value="sikiedu" scope="request"> </c:set>
<%-- ${username } --%>

<!-- 移除数据 -->
<c:remove var="username"/>

<!-- 输出数据 -->
<c:out value="${username }"></c:out>

<c:if test="true">
真的</c:if>

<c:set var="age" value="20" scope="request"></c:set>
<c:if test="${age>=18 }">
<font color='red' >你是成年!</font>
</c:if>

<!-- if  else -->
<c:choose>
	<c:when test="${age>=18 }"><font color='red' >你是成年!</font></c:when>
	<c:otherwise><font color='green' >你是未成年!</font></c:otherwise>
</c:choose>



<%
List<User> list=new ArrayList<User>();
list.add(new User("每国","123",90,"男",false));
list.add(new User("应国","123",90,"男",false));
list.add(new User("日国","123",90,"男",false));
list.add(new User("汉国","123",90,"男",false));
list.add(new User("中国","123",90,"男",false));
request.setAttribute("list",list);

%>
<c:forEach items="${list }" var="u">
${u.username }
</c:forEach>
<!-- 注意;list不能之间写list,按照上面格式写! -->

<c:forEach var="i" begin="1" end="10">
这是第${i }循环<br>

</c:forEach>


 

json

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of theJavaScriptProgramming Language Standard ECMA-262 3rd Edition - December 1999.
fastjson中文文档

package com.mine.util;

import com.alibaba.fastjson.JSON;
import com.mine.model.Goods;

public class JsonTest {
	public static void main(String[] args) {
		//序列化 持久化
		Goods goods=new Goods("香蕉","夏威夷香蕉",100,400);
		String json =JSON.toJSONString(goods);
		System.out.println(json);
		
		//反序列化 json解析
		
		String s="{\"des\":\"夏威夷香蕉\",\"inventor\":400,\"name\":\"香蕉\",\"price\":100}";
	Goods goods1=JSON.parseObject(s, Goods.class);
		System.out.println(goods1.getName());
		System.out.println(goods1.getInventor());
	}
}

运行结果

{"des":"夏威夷香蕉","inventor":400,"name":"香蕉","price":100}
香蕉
400

 

Ajax

我们在页面没有跳转刷新的时候可向服务器端发起请求,并得到服务器端的数据。
我个人绝对老师ajax部分讲的不太好,迷迷糊糊的。
 

过滤器

过滤请求 不合要求的请求可让其不能访问
应用:
1.权限控制:比如不是管理员不能通过url进行访问相应页面
2.过滤敏感词汇

filter过滤的顺序与配置文件书写的顺序有关

  <filter>
  	<filter-name>test1filter</filter-name>
  	<filter-class>com.sikiedu.filter.Test1Filter</filter-class>
  </filter>
   <filter>
  	<filter-name>test2filter</filter-name>
  	<filter-class>com.sikiedu.filter.Test2Filter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>test1filter</filter-name>
  	<url-pattern>/*</url-pattern>   
  </filter-mapping>
  <filter-mapping>
  	<filter-name>test2filter</filter-name>
  	<url-pattern>/*</url-pattern>   
  </filter-mapping>

根据filter-mapping的顺序
请求先进入test2filter在进入test1filter 响应从2到1

过滤器解决中文参数乱码问题
package com.sikiedu.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;


@WebFilter("/*")
public class EncodeFilter implements Filter {

   

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		
		request.setCharacterEncoding("utf-8");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}


}

 

通过配置文件配置编码方式(推荐)
web.xml

 <filter>
  <filter-name>EncodeFilter</filter-name>
  <filter-class>com.sikiedu.filter.EncodeFilter</filter-class>
  <init-param>
  <param-name>Encoding</param-name>
  <param-value>UTF-8</param-value>
  </init-param>
  </filter>
  <filter-mapping>
  <filter-name>EncodeFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

EncodeFilter过滤器

package com.sikiedu.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;


//@WebFilter("/*")
public class EncodeFilter implements Filter {

   private String encoding;

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		
		request.setCharacterEncoding(encoding);
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
		encoding =fConfig.getInitParameter("Encoding");
	}

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}
}

我容易犯的错误
<filter-class>里面写.java 不要把.java也复制过来!!!
 

权限管理过滤器

这样不允许不是管理员登录不能访问管理员的后台页面
web.xml

<filter>
  <filter-name>AdminFilter</filter-name>
  <filter-class>com.sikiedu.filter.AdminFilter</filter-class> 
  </filter>
  <filter-mapping>
  <filter-name>AdminFilter</filter-name>
  <url-pattern>/admin/*</url-pattern>
  </filter-mapping>

AdminFilter.java

package com.sikiedu.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.mine.model.User;

/**
 * Servlet Filter implementation class AdminFilter
 */
@WebFilter("/AdminFilter")
public class AdminFilter implements Filter {

    /**
     * Default constructor. 
     */
    public AdminFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		
		HttpServletRequest httpReq=(HttpServletRequest) request;
		HttpServletResponse httpResp=(HttpServletResponse) response;
		
		Object o=httpReq.getSession().getAttribute("user");
		if(o==null){
			httpResp.sendRedirect(httpReq.getContextPath()+"/index.jsp");
		}else{
			User u=(User) o;
			if(u.isAdmin()){
				chain.doFilter(request, response);//如果是管理员放行
			}else{
				httpResp.sendRedirect(httpReq.getContextPath()+"/index.jsp");
			}
		}

		// pass the request along the filter chain
		
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

设置过滤器的请求类型
<filter>
  <filter-name>DispatcherFilter</filter-name>
  <filter-class>com.sikiedu.filter.DispatcherFilter</filter-class> 
  </filter>
  <filter-mapping>
  <filter-name>DispatcherFilter</filter-name>
  <url-pattern>/dispatcher1.jsp</url-pattern>
  <dispatcher>INCLUDE<dispatcher>
  </filter-mapping>

dispatcher:
dispatcher1.jsp只有被包含到别的页面中时,DispatchFilter过滤器才会生效
默认的时Request
FORWARD:表示被转发到这个页面
 

监听器Listener

用来监听request session application
HttpServletRequest HttpServletSession ServletContext
监听:
3个对象的创建与销毁
3个对象的属性

1.监听器是个类,创建类
2.实现监听器接口
javax.servlet.ServletContextlistener
HttpSessionListener
ServletRequestListener

ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

3.配置

<listener>
<listener-class></listener-class>
</listener>

或注解的方式@WebListener

应用:
统计在线人数
web应用启动起来的时候做一些初始化的工作

session会话时间配置

  <session-config>
  <session-timeout>1</session-timeout>
  </session-config>

单位:min
 
单点登录:同一时间只能登录一个ip
SessionListener.java

package com.sikiedu.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import com.mine.model.User;
import com.mine.util.SessionManage;

/**
 * Application Lifecycle Listener implementation class SessionAttributeListener
 *
 */
@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener {

    /**
     * Default constructor. 
     */
    public SessionAttributeListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
     */
    public void attributeAdded(HttpSessionBindingEvent arg0)  { 
        
//    	当我们监听到session里新加了一个user的时候,我们就会把信息放到sessionMap中
    	if(arg0.getName().equals("user")){
    		User u=(User) arg0.getValue();
    		//判断是否有其它客户端已经登录
    		if(SessionManage.sessionMap.containsKey(u.getUsername())){
    			//获得另外一个客户端的session
    			HttpSession session=SessionManage.sessionMap.get(u.getUsername());
    			//把登录信息从这个客户端抹除
    			session.removeAttribute("user");
    			//从session集合里移除对应的用户名
    			SessionManage.sessionMap.remove(u.getUsername());
    		}
    		SessionManage.sessionMap.put(u.getUsername(),arg0.getSession());
    	}
    }

	/**
     * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
     */
    public void attributeRemoved(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    	System.out.println("session attributeRemoved");
    }

	/**
     * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
     */
    public void attributeReplaced(HttpSessionBindingEvent arg0)  { 
         // TODO Auto-generated method stub
    }
	
}

 

SessionManage.java

package com.mine.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

public class SessionManage {
	public static Map<String,HttpSession> sessionMap=new HashMap<String, HttpSession>();
}

 

附:
P19这集跟代码的时候出了很多bug。多看多复习
P34调试代码方法值得学习
p30
jstl jar包下载https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
fastjson文档

收藏网站
MVNrespository

google浏览器 ctrl+F 查找

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值