jspservlet

jsp

配置jdk,配置tomcat,启动tomcat只需要在cmd中startup即可

127.0.0.1:8080

访问这个,必须要先startup tomcat才行

创建文件时报错:Address localhost:1099 is already in use

解决方法:在cmd中输入

netstat -ano | find "1099"
tasklist | find "69956"

69956是上一个命令得出来的pid码

taskkill /f /t /im java.exe

java.exe是上一个命令得到的进程的名字

新建war包:

1.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PASsgU35-1627030483308)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195151525.png)]

2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLaUbrLR-1627030483309)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195239417.png)]

3.apply然后ok

4.buildwar包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-leSBZfRZ-1627030483310)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195336959.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFO5ftaq-1627030483312)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195405872.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYABM7JS-1627030483313)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195438425.png)]

在Tomcat里部署war包:

1.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvvuy8aV-1627030483314)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195701525.png)]

2.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3Q5fmr4-1627030483314)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719195721023.png)]

3.aply ok

创建servlet类

1.在src文件里面创建如图的类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DClF33sW-1627030483315)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204121296.png)]

2.继承HttpServlet类的时候发现没有这个类,就需要添加jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdQqLk7p-1627030483315)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204314796.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtnCa9bi-1627030483316)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204418175.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItCSZzzK-1627030483316)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204441877.png)]

4.然后在tomcat的lib里面找到对应的包把它复制到lib里面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yfi0uMCh-1627030483316)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204712829.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6i2zcILx-1627030483317)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719204905355.png)]

5.最后把lib添加到文件中作为库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RuBWxSH6-1627030483317)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719205241647.png)]

于是就有了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kDhiroOQ-1627030483317)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719205319128.png)]

然后就可以重写里面的方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JMKnE7R6-1627030483318)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210719205637010.png)]

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String header=req.getHeader("content-type");
        System.out.println(header);
        PrintWriter writer=resp.getWriter();
        writer.write("<h1>hello<h2>");
        writer.flush();
        writer.close();
    }

6.配置servlet的路径,在web.xml文件中配置

<servlet>
        <servlet-name>user</servlet-name>
        <servlet-class>com.xinzhi.controller.User</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>user</servlet-name>
        <url-pattern>/user.do</url-pattern>
</servlet-mapping>

之后就可以用…/user.do访问这个网页了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kBoNNd2-1627030483318)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720092738984.png)]

也可以直接进行注释配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxt31s5g-1627030483319)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720111233692.png)]

7.解决中文的乱码问题

在servlet类中添加如下的语句:

resp.setCharacterEncoding("utf-8");
resp.addHeader("content-type","text/html;charset=utf-8");

第一句的作用是保证服务器(本地)处理的时候按照utf-8处理字符串

第二句的作用是保证客户端处理的时候按照utf-8处理字符串,第二句更重要,第一句可以不写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vbkne7hu-1627030483319)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720093534117.png)]

url的匹配规则

1.精确匹配:<url -pattern>中配置的项必须与url完全精确匹配。

<url-pattern>/user/users.html</url-pattern>
<url-pattern>/index.html</url-pattern>
<url-pattern>/user/addUser.action</url-pattern>

**2. 路径匹配:**以“/”字符开头,并以“/*”结尾的字符串用于路径匹配

<url-pattern>/user/*</url-pattern>

3.扩展名匹配 *.

以任何结尾为*.后的扩展名的网页会被匹配

<url-pattern>*.jsp</url-pattern> 
<url-pattern>*.do</url-pattern>

4.缺省匹配

<url-pattern>/</url-pattern>
匹配顺序
  1. 精确匹配。

  2. 路径匹配,先最长路径匹配,再最短路径匹配。

    (就是说/user/app会优先于/user)

  3. 扩展名匹配。注意:使用扩展名匹配,前面就不能有任何的路径。

  4. 缺省匹配,以上都找不到servlet,就用默认的servlet,配置为<url-pattern>/< /url-pattern>

欢迎页

就是啥都不干默认打开的界面,默认是index.jsp

<welcome-file-list>
        <welcome-file>/hello.html</welcome-file>
</welcome-file-list>

可以连接到web文件夹里面的文件,也可以匹配servlet url匹配的网页

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aHD6uMB-1627030483320)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720101948347.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuZyj1J5-1627030483320)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720102007211.png)]

请求传参(doGet):

req.getParameter用来获取请求的传入的参数,后面的String类型的变量表示这个参数是什么

user中:

@WebServlet("/user.do")
public class User extends HttpServlet {
    private userdao dao=new userdao();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.addHeader("content-type", "text/html;charset=utf-8");
        String username = req.getParameter("username");
        String age = req.getParameter("age");
        dao.cun(username,age);
    }
}

userdao中:

public class userdao {
    public void cun(String name,String age)
    {
        System.out.println("存数据");
        System.out.println(name+"+"+age);
    }
}

如何传参:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5kLspqi-1627030483320)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720131526644.png)]

以?(必须是英文的问号)开始,然后user中定义了什么类型的参数就传什么样的参数进去

两个参数之间用&号连接

成功之后后端就有结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VX3le6cU-1627030483321)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720132045437.png)]

另一种方法,一次传多组同类的参数:

String[] username=req.getParameterValues("username");
for (String name:username) {
            System.out.println(name);
        }

这样就不用dao类用foreach直接输出,req.getParameterValues指一次可以传入多个这个类型的参数

传表单:(只能用doPost)

1.先在index.jsp中添加一个表单

<form method="post" action="/servelet_study_war_exploded/user.do">
    用户名:<input name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="点此提交">
  </form>

需要注意的是这个action里的网址一定要写完整,就是8080后面的那一串都要写上去,不然就会404

method也一定要改成post

2.在user中重写doPost

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.addHeader("content-type", "text/html;charset=utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username);
        System.out.println(password);
    }

3.成功后就会在后端中输出数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QPBiI3hc-1627030483321)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720141634510.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWFEE5ti-1627030483322)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720141653286.png)]

请求转发:

新建一个servlet并且完成配置

@WebServlet("/user2.do")
public class User2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.addHeader("content-type", "text/html;charset=utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("This is User2.");
        System.out.println(username);
        System.out.println(password);
    }

然后在原有的User上加上转发的代码:

req.getRequestDispatcher("/user2.do").forward(req,resp);

第一个空里填要转发的目标servlet的地址,第二个填req和resp(就是把请求和响应都给转发过去)

也可以这么写:

RequestDispatcher rd = request.getRequestDispatcher("/User2"); 
rd.forward(req, resp);

然后转发成功的结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3X0rUNiN-1627030483322)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720152751873.png)]

request域方法

添加:

req.setAttribute("a","1");
req.setAttribute("b","2");
req.setAttribute("c","3");
req.getRequestDispatcher("/user2.do").forward(req,resp);
  • 注意:要先进行存值操作然后再进行转发操作

  • 前面是key后面是object(int,string等等都可以,甚至可以是个对象),把这些东西加到了请求的域里面,后续的转发都可以使用

  • 就把域想象成一个哈希表,通过键值可以存储也可以提取物品进行使用

使用:

System.out.println(req.getAttribute("a"));
System.out.println(req.getAttribute("b"));
System.out.println(req.getAttribute("c"));

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeKDpJr6-1627030483322)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720162003312.png)]

响应头:

是服务器发送给客户端浏览器,告诉浏览器要做什么

使用response对象的setHeader()方法来设置响应头

response.setHeader(“content-type”, “text/html;charset=utf-8);

作用是告诉浏览器器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”);

response.setHeader("Refresh","5; URL=http://www.baidu.cn")

5秒后跳转百度

响应输出:
PrintWriter writer =resp.getWriter();
writer.write("<html>");
writer.write("<h1>title</h1>");
writer.write("</html>");

注意这个相应输出一定要写在最后转发的那个servlet里面,不然就会没有效果

我这里user2转发user,相应输出写在user2里面,网页就如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tKe0yiM-1627030483323)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210720195757545.png)]

是在user.do里面显示的,因为这是服务器转发,客户端浏览器不知道后端转发做了什么,他只显示在最开始的那个servlet界面上

注意resp.getWriter()是有缓冲区的,当要输出的内容小于8kb的时候就会一直放在缓冲区,必须要加上resp.flushBuffer();

响应解决乱码:

response.setContentType("text/html;charset=utf-8")
response.addHeader("content-type", "text/html;charset=utf-8")

两种方法是等价的,都是既处理了服务器里的中文字(即包response.setCharaceterEncoding(“utf-8”)),也处理了客户端里的中文字

请求说到底就是浏览器上的操作发送到服务器内部进行处理,响应就是服务器内部的操作要在浏览器上显示出来

重定向
response.setStatus(302); 
response.setHeader("Location", "http://www.baidu.com");

上面代码的作用是:当访问Servlet后,会通知浏览器重定向到百度主页。客户端浏览器解析到响应码

为302后,就知道服务器让它重定向,所以它会马上获取响应头Location,然发出第二个请求。

  • 重定向是两次请求(服务器发一次,浏览器发一次),请求转发是一次

  • 重定向的URL可以是其他应用,不局限于当前应用

  • 重定向的响应头为302,并且必须要有Location响应头

  • 重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常

重定向和转发的区别:
  • 重定向是两次请求,请求转发是一次
  • 重定向是浏览器的行为,请求转发是服务器行为
  • 重定向浏览器的地址会发生改变,转发不会
  • 重定向可以重定向到任何地址,转发只能在项目内转发

jsp

jsp本质上就是html,通过一些特殊的手段将.jsp文件用.java文件写了出来,将jsp中的html语句自动转化为了响应输出:jsp的本质其实就是个html模板,编译器会根据模板生成对应的servlet。

服务器不能识别html文件,浏览器也不能识别jsp文件,所以jsp文件就在服务器被转化成了servlet文件,然后再在浏览器中响应

PrintWriter writer =resp.getWriter();
writer.write("<html>");

先要把相应的jar包导到lib中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktyTXpsy-1627030483323)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210721093021675.png)]

语法

1.语句块:

jsp中html语句正常使用,Java的语句块用<% %>括起来

<%
  System.out.println("123");
  response.getWriter().write("abc");
%>

注意:这里只有abc能被打到浏览器界面上,因为System.out.println是被输出到后端上的,想要输出到浏览器上就必须使用响应输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVjC0PZ5-1627030483323)(C:\Users\11234\AppData\Roaming\Typora\typora-user-images\image-20210721100806176.png)]

2.脚本表达式

表示用<%= %>括起来的东西是java里面的东西,可以是变量也可以是表达式表达式必须能求值使用方法:

<%
for(int i=0;i<10;i++){
%>
<h1>
    <%=i%>
</h1>
<%
}
%>

这样的话i就会被视作上个java语句中的变量i,就会从1到9逐渐打印出来

不然如果直接写<%i%>的话,这个i就是i,就是在页面上打印上10个i

3.静态方法的声明

方法的声明必须使用<%! %>,因为只有这样方法才能被写到类里面,不然的话就会被写到server方法里面,方法写在方法里面肯定会报错

4.三种注释

1.html注释 这个注释能在网页上被看见,就是浏览器f12就能看见注释,但是页面上还是看不见注释的

2.jsp注释<%-- --%> 这个注释比较特殊,只会在jsp文件内部以及被编译过后的java文件中显示,别的地方都看不见

3.java注释 // 这个就是最普通的后端代码的注释

指令

<%@ 指令名 属性1 = "属性1的值" 属性2 = "属性2的值" ....%>
  • 指令名:用于指定指令名称 在JSP中包含page include raglib 这3种指令

  • 属性: 用于指定指令属性名称 不同的指令包含不同的属性 在同一个指令中可以设置多个属性 各个属性之间用逗号或者空格隔开

1.page

用于设置整个jsp界面的属性

  • language
page language="java"

语言设置为Java,不写也没事

  • import
page import="java.util.*"

作用是导入Java的类包,比较重要

  • pageEccoding(contentType)
page contentType ="text/html;charset=UTF-8"
2.include

用于在一个jsp文件中引入另一个jsp文件

include file="a.jsp"

标签

1.< jsp:include>(要有< /jsp:include>结尾)

<jsp:include page="a.jsp"></jsp:include>

和指令的区别在于标签是动态引入,在编译时会被编译成两个servlet,然后在执行时再将两个servlet内容合并,即JSP页面运行时才将文件加入

2.<jsp:forward >(也是要有结尾的) 以及<jsp:param >(没有结尾

<jsp:forward page="a.jsp">
 <jsp:param name="user" value="littlered">
</jsp:forward>

forword就是请求转发,会直接跳转到另一个指定的jsp界面

param就是域操作,就是把东西以键值存进域中,然后在那个a.jsp中可以使用request.getParameter(“user”)取出键值为user对应的数据

内置对象

1.request response 对象

servlet中怎么用jsp里也怎么用

2.session对象

指的是客户端与服务器的一次会话 , 从客户连接到服务器的一个 WebApplication 开始 , 直到客户端与服务器断开连接为止

使用:

session.setAttribute(“userName”,”wfpan”);

session.setAttribute(“pwd”,”123”);//登录成功

session.setMaxInactiveIntervalTime();

session.getAttrite();

session.invalidate(); //退出登录
mvc三层架构

1.model

主要是javabean实体类对象,提供多个set和get的方法,通过jdbc读取到数据库里的数据然后转到controller里面

2.view

主要是jsp界面,向controller提供数据,然后在浏览器界面上显示数据

3.controller

rd就是请求转发,会直接跳转到另一个指定的jsp界面**

param就是域操作,就是把东西以键值存进域中,然后在那个a.jsp中可以使用request.getParameter(“user”)取出键值为user对应的数据

内置对象

1.request response 对象

servlet中怎么用jsp里也怎么用

2.session对象

指的是客户端与服务器的一次会话 , 从客户连接到服务器的一个 WebApplication 开始 , 直到客户端与服务器断开连接为止

使用:

session.setAttribute(“userName”,”wfpan”);

session.setAttribute(“pwd”,”123”);//登录成功

session.setMaxInactiveIntervalTime();

session.getAttrite();

session.invalidate(); //退出登录
mvc三层架构

1.model

主要是javabean实体类对象,提供多个set和get的方法,通过jdbc读取到数据库里的数据然后转到controller里面

2.view

主要是jsp界面,向controller提供数据,然后在浏览器界面上显示数据

3.controller

servlet对象,一般是在servlet初始化一个实体类,然后把jdbc查询结果存进去,这是与model的交互,然后注意,在servlet里面把请求转发到一个jsp文件中,那么这个servlet就会自动显示jsp文件中的界面,并且界面的url仍然是servlet的url而不是jsp文件的url,这样就可以设计前端了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值