JavaWeb

1认识jsp

在eclipse中创建的项目:

浏览器可以直接访问WebContent中的文件

例如http://localhost:8080/MyJsp/index01.jsp

其中index01.jsp就在WebContent目录中

但是WEB-INF中的文件 无法通过客户端直接访问 只能通过请求转发访问

并不是任何的内部跳转都能访问 重定向不可以

同一字符集编码

设置jsp文件编码 pageEncoding JSP—JAVA

在这里插入图片描述

浏览器读取jsp文件的编码
在这里插入图片描述

文本编码

2编码问题 jsp元素

tomacat部署完成之后 自动拷贝一份 放到项目中 与本地安装的tomcat没有关系

JSP页面元素 :

<%

​ 局部变量

%>

<%!

​ 全局变量和方法

%>

<%= 打印变量 %>

修改web.xml配置文件 配置文件 java 需要重启 tomcat

修改jsp、html、css不需要重启

在这里插入图片描述
使用Post提交

如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding(“UTF-8”))

使用Get提交

如果提交方式为get,设置request对象的编码是无效的,request对象还是以默认的ISO8859-1编码接收数据,因此要想不乱码,只能在接收到数据后再手工转换,步骤如下:

获取获取客户端提交上来的数据,得到的是乱码字符串,data=”???è???”

String data = request.getParameter(“paramName”);
1
查找ISO8859-1码表,得到客户机提交的原始数据的字节数组

byte[] source = data.getBytes(“ISO8859-1”);
1
通过字节数组以指定的编码构建字符串,解决乱码

data = new String(source, “UTF-8”);
1
  通过字节数组以指定的编码构建字符串,这里指定的编码是根据客户端那边提交数据时使用的字符编码来定的,如果是GB2312,那么就设置成data = new String(source, “GB2312”),如果是UTF-8,那么就设置成data = new String(source, “UTF-8”)
————————————————
tomcat7或以下 默认编码ios8859-1 即使在页面内更改编码 提交的数据也会乱码 通过上述方式结局或者更改配置文件 server.xml更改

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

更改之后get方式提交的数据都没问题 如果是post方式 还需要在输出页面加一段话

request.setCharacterEncoding(“UTF-8”);

3 JSP内置对象

自带的一些对象

out

aplication

pageContext

config

exception

session

page

response:

响应信息:存储返回给客户端的信息

常见方法:

void addCookie(Cookie cookie) 服务端向客户端增加一个cookie对象

void senRedirect(String location) 页面跳转的一种方式

void setContentTyoe(String type) 设置服务端响应编码

requset:

请求对象 存储客户端向服务端请求时保存的一些信息

常见方法:

String getParameter(String name) 根据请求的字段名返回字段值

String[ ] getParametervalues(String name) 根据请求的字段名返回多个字段值 常见于复选框

setCharacterEncoding(“编码格式”):设置请求编码格式

getRequestDispatcher(). forward 请求转发

ServletContext getServletContext () 获取项目的ServletContext 对象

4请求转发和重定向

在这里插入图片描述
在这里插入图片描述

请求转发:地址栏不变 携带之前的参数 请求1次 在服务器端跳转

重定向 地址栏改变 不携带参数 请求2次 在客户端发生跳转

5Cookie

cookie(存在于客户端 不是内置对象):是由服务端产生发送给客户端保存

相当于本地缓存

public Cookie(String name ,String value);构造方法

String getName() 获取key

String getValue () 获取value

void setMaxAge(int expiry) 设置Cookie最大有效时间

服务端发送给客户端:

1:response.addCookie(Cookie cookie) 响应给客户端一个Cookie

客户端获取Cookie:

request.getCookies() 获取全部Cookie

6Session

a:浏览网站 打开网站-关闭网站 算一次会话

session机制 当客户端第一次访问浏览器 会产生一个session对象 自带一个sessionID 把sessionID的值复制变成JsessionID 然后放到Cookie中去 服务器短的sessionID和客户端的JsessionID一一对应
在这里插入图片描述

Session:

a :Session存储在客服端

b:同一个用户请求共享这个sessionID

session方法:

String getId();获取sessionId

boolean isNew()判断是否是第一次访问(新用户)

void invalidate() 使session生效 (退出登录,注销)

void setAttribute(String key ,Object object)

Object getAttribute(String key)

void setMaxInactiveInteval(秒) 设置最大非活动时间

void getMaxInactiveInteval(秒) 查看最大非活动时间

7Cookie和session区别

​ session cookie

保存的位置 服务端 客户端

安全性 安全 不安全

保存的内容 Object String

8application

String getContextPath() 返回绝对路径

String getRealPath() 返回虚拟路径对应的绝对路径

9四种范围对象

pageContext 当前页有效 换一个页面获取值为null

request 同一次请求有效 重定向发生了俩次请求 所以重定向无效了

session 同一次会话有效 一次赋值 只要不切换或不关闭浏览器 所有页面都能拿到session的值

application 项目下有效 一次赋值 切换浏览器也有效 关闭服务器或在其他项目无效

以上四个对象共有的方法

Object getAttribute(String name )根据属性名 或取鼠行者

void setAttribute(String name Object object) 设置属性值

void removeAttribute(String name)根据属性名删除值

以上范围对象 尽量使用最小的范围 因为范围越大性能损耗越大

10JavaBean

JavaBean就是一个类满足以下条件

1public修饰的类 public修饰的无参构造

2所有属性都用private修饰 并且提供set/get方法

使用层面 Java分为俩打雷

a:封装了业务逻辑的JavaBean 比如登录逻辑

b:封装数据JavaBean Student Teacher类等

​ 对应数据库中的一张表

11MVC设计模式

在这里插入图片描述

Servlet:

servlet充当控制器

​ a:必须继承javax.servlet.http.HttpServlet

​ b:必须重写doGet()或doPost()方法

要想使用Servlet 必须配置

Servlet2.5 web.xml

Servlet3.0 @WebServlet("")

生命周期

加载

初始化init() Servlet被加载并实例化之后执行

服务 service()

销毁 destory() Servlet被系统回收时执行

卸载

加载和卸载 由Java自动处理

init() 第一次访问时会被执行 且只执行一次

destroy() 关闭tomcat服务时执行

如何更改init初始化时机

在这里插入图片描述

写配置文件 启动tomcat时初始化 1代表先初始化这个servlet 其他的写234。。

Servlet继承关系

在这里插入图片描述在这里插入图片描述

ServletConfig接口:

​ getServletContext()获取Servlet上下文对象 application对象就是它产生的
在这里插入图片描述
配置全局参数

servlet初始化参数

在这里插入图片描述

在这里插入图片描述

service方法
在这里插入图片描述

MVC

在这里插入图片描述

三层:

表示层 ------前台代码 对应mvc中的view 用于洁面的现实 jsp js HTML css

​ 后台:对应于mvc中的controller 用于控制跳转 调用业务逻辑 servlet springmc

​ 代码位置 :Webcontent

数据访问层 :直接访问数据库 (增删改查)

​ service包

业务逻辑层:一组数据访问层 逻辑性的操作

​ 接受表示层的请求调用

​ xxx.dao包

上层将请求传递给下层 下层处理之后返回给上层
在这里插入图片描述
在这里插入图片描述
上层依赖下层

Mysql插入中文问题 建立表的时候写这个

CREATE   TABLE    database_user  ( 
ID varchar (40) NOT  NULL , 
UserID varchar (40) NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

分页

在这里插入图片描述

在这里插入图片描述

第0页

select * from student limit 0,10

第一页

select * from student limit 10,20

第二页

select * from student limit 20,30

通式 select * from student limit 页数*页面大小 ,页面大小

分页实现:

5个变量

1数据总量

2页面大小(每页显示多少数据)

3总页数

​ 总页数 =数据总量%每页数据量>0?数据总量/每页数据量 :数据总量/每页数据量+1

4当前页(页码)

5每一页所有数据的集合

​ 分页sql查出数据放到集合中

12Filter (重点)

public class CharacterEncodingFilter implements Filter {

    //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
    }

    //Chain : 链
    /*
    1. 过滤中的所有代码,在过滤特定请求的时候都会执行
    2. 必须要让过滤器继续同行
        chain.doFilter(request,response);
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("CharacterEncodingFilter执行前....");
        chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
        System.out.println("CharacterEncodingFilter执行后....");
    }

    //销毁:web服务器关闭的时候,过滤会销毁
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
    }
}

  1. 在web.xml中配置 Filter

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--只要是 /servlet的任何请求,会经过这个过滤器-->
        <url-pattern>/servlet/*</url-pattern>
        <!--<url-pattern>/*</url-pattern>-->
    </filter-mapping>
    

13、监听器

实现一个监听器的接口;(有N种)

  1. 编写一个监听器

    实现监听器的接口…

    //统计网站在线人数 : 统计session
    public class OnlineCountListener implements HttpSessionListener {
    
        //创建session监听: 看你的一举一动
        //一旦创建Session就会触发一次这个事件!
        public void sessionCreated(HttpSessionEvent se) {
            ServletContext ctx = se.getSession().getServletContext();
    
            System.out.println(se.getSession().getId());
    
            Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount==null){
                onlineCount = new Integer(1);
            }else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count+1);
            }
    
            ctx.setAttribute("OnlineCount",onlineCount);
    
        }
    
        //销毁session监听
        //一旦销毁Session就会触发一次这个事件!
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext ctx = se.getSession().getServletContext();
    
            Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount==null){
                onlineCount = new Integer(0);
            }else {
                int count = onlineCount.intValue();
                onlineCount = new Integer(count-1);
            }
    
            ctx.setAttribute("OnlineCount",onlineCount);
    
        }
    
    
        /*
        Session销毁:
        1. 手动销毁  getSession().invalidate();
        2. 自动销毁
         */
    }
    
    
  2. web.xml中注册监听器

    <!--注册监听器-->
    <listener>
        <listener-class>com.kuang.listener.OnlineCountListener</listener-class>
    </listener>
    
  3. 看情况是否使用!

14、过滤器、监听器常见应用

监听器:GUI编程中经常使用;

public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame("中秋节快乐");  //新建一个窗体
        Panel panel = new Panel(null); //面板
        frame.setLayout(null); //设置窗体的布局

        frame.setBounds(300,300,500,500);
        frame.setBackground(new Color(0,0,255)); //设置背景颜色

        panel.setBounds(50,50,300,300);
        panel.setBackground(new Color(0,255,0)); //设置背景颜色

        frame.add(panel);

        frame.setVisible(true);

        //监听事件,监听关闭事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
            }
        });


    }
}

用户登录之后才能进入主页!用户注销后就不能进入主页了!

  1. 用户登录之后,向Sesison中放入用户的数据

  2. 进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    
    if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
        response.sendRedirect("/error.jsp");
    }
    
    chain.doFilter(request,response);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值