目录
1⃣️笔记篇
这片笔记是看动力节点的J2EE做的笔记(所以我的观点不一定是对的😂😂😂)
1.网站中所有的servlet接口实现类的实例对象,只能由http服务器负责创建。
开发人员不能手动创建servlet接口实现类的实例对象
- 在默认的情况下,此http服务器接收到对于当前servlet接口实现类第一次请求时
自动创建这个servlet接口实现类的实例对象
在手动配置情况下,要求http服务器在启动时自动创建某个servlet接口实现类的实例对象
<servlet>
<servlet-name >mmn</servlet-name><!--声明一个变量存储servlet接口实现类类跳中。-->
<servlet-class>com.bjpowernode.controller.OneSerlvet</servlet-class>
<load-on-startup>30<load-on-startup>
<!--这里的load-on-startup的意思是启动Tomcat的时候自动创建这个Servlet对象-->
<!-- 正常情况下是要访问了这个网页才创建这个Servlet对象 -->
<!-- 填写一个大于0的整数即可 -->
</servlet>
<servlet>
<servlet-name>TwoServelet</servlet-name>
<servlet-class>com.bjpowernode.controller.TwoServlet</servlet-class>
<servlet-mapping>
<servlet-name>TwoServelet</servlet-name>
<url-parttern>/two</url-parttern><!--url访问的时候可以/two访问-->
</servlet-mapping>
</servlet>
3.在http服务器运行期间,1个servlet接口实现类只能被创建出一个实例对象
- 在http服务器关闭时刻,自动将网站中所有的servlet对象进行销毁
下面这张图的申请的资源就是TwoServlet
调用语句
request.getRequestDispatcher(“xxx.jsp”).forward(request, response);
好处:减少了和浏览器的交互次数,第二次调用是在服务端调用的,节省了时间开销
1) 无论本次请求选及到多少个servlet,用户只需要手动通过浏览器发送一次请求
2) servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
增加处理服务速度
2⃣️Servlet运行示例代码
MyLogin.java
如果webServlet的写了name属性,那么他的双引号里面开头就不需要以/
开头了,如果没有name属性,则需要以/
开头
package test;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@WebServlet (name="myUserServlet",urlPatterns = "/Login")
public class MyLogin extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res){
String un=req.getParameter("username");//username是从req里面获取的一个参数,从表单里面获取一个名字是username的组件,然后获取其值并输出
try
{
System.out.println("servlet is running!!");
res.setContentType("text/html;charset=gb2312");
PrintWriter pw=res.getWriter();
pw.print("<H1>Thank you"+un+".</H1>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>Login</h1>
<form action="Login"method="post"><!--这里的action指向的文件要和上文提到的urlPartern指示的路径要一致,否则程序不能正常运行-->
<p>Username:
<input type="text" name="username" size="20">
<p>password:
<input type="password" name="password" size="21">
<input type="submit" value="提交">
</form>
</body>
</html>
3⃣️HttpServlet
Servlet是一个接口,其子类实现Servlet的时候需要实现其中的所有抽象方法,包括service方法,service再根据不同的请求方式来做不同的响应,子类因此需要根据不同的请求方式来编写重复的代码,非常的不方便,因此在这种情况下,子类可以继承HttpServlet,HttpServlet是Servlet的子类,HttpServlet有doPost和doGet等方法,可以根据不同的请求方式来调用不同的方法,避免了代码的重复编写
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo2")//资源请求路径
public class ServerletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpServletRequest request=req;
//编写不同的业务代码
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//编写不同的业务代码
}
}
4⃣️Request的中文乱码
中文乱码有get请求和post请求下的中文乱码
解决方案:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");//doPost第一句代码这样写就行,一定要在第一句!!
}
5⃣️重定向与请求转发区别
6⃣️虚拟目录的问题
7⃣️在Servlet里面往网页里面写html的内容
下面是登陆页面:跳转到一个servlet
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<center>
<H1>登陆系统</H1>
<form action="ServletDemo3" method="get">
账号:<input type="text" name="1" value="zhangsan"><br>
密码:<input type="password" name="2" value="123"><br>
<input type="submit">
<input type="reset">
</form>
</center>
</body>
</html>
下面的代码注释了response.setHeader("content-type", "text/html");
代码中的response.setHeader("content-type", "text/html");
设置相应头的内容(content-type
),设置为以html格式来解析网页的文本内容(text/html
)
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 java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/ServletDemo3")
public class ServletDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// response.setHeader("content-type", "text/html");
PrintWriter pw=response.getWriter();
pw.println("<h1>LoginSystem</h1>");
//该字符流不需要关闭,随着reponse对象的销毁,该流自动关闭!!
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果:
代码解除注释response.setHeader("content-type", "text/html");
后
另外,如果response写到网页的内容乱码了,可以在doPost或者doGet里面第一句写
response.setContentType("text/html;charset=utf-8");
,就不用设置相应头来以html格式解析网页文本内容,而且直接就以utf-8来解析内容,但是这个语句的内容先后次序不能乱!!!
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter pw=response.getWriter();
pw.println("<h1>LoginSystem</h1>");
}
说多一句:Tomcat默认字符集就是ISO-8859-1
,浏览器默认字符集是utf-8
,所以很多情况下中文都是乱码!!!