1.hello servlet
1.1重写doGet()和doPost()方法1.2 servlet注册映射1.3 运行结果 2.ServletContext
2.1一个servlet向共享的servletcontext写入数据2.2另一个servelt读取context中的信息2.3servlet注册映射2.4运行结果 3.get parameter
运行结果 4.转发 getRequestDispatcher()
4.1中文乱码问题4.2运行结果 5.资源读取getResourceAsStream()
4.1中文乱码问题4.2运行结果
1.hello servlet 1.1重写doGet()和doPost()方法package com.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("你好 servlet");
//这部分是设置context键值对,第2部分内容,写入servletcontext信息
ServletContext context = this.getServletContext();
context.setAttribute("name","用户名");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req ,resp);
}
}
1.2 servlet注册映射
在web.xml文件中写入
1.3 运行结果 2.ServletContexthello com.servlet.MyServlet hello /hello
servletContext是所有servlet共享的一个对象,可以用于多个servlet进行信息传递
就和多线程中共享存储器类似
2.1一个servlet向共享的servletcontext写入数据完整代码请看1.1
ServletContext context = this.getServletContext();
context.setAttribute("name","用户名");
2.2另一个servelt读取context中的信息
public class Getcontext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("name");
PrintWriter writer = resp.getWriter();
writer.println("get name = "+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
2.3servlet注册映射
gc com.servlet.Getcontext gc /get
后面有需要注册映射的省略不写
2.4运行结果 3.get parameter在xml文件中存在parameter预设属性,可以通过servletcontext的getInitParameter(name:)方法获取到属性值
mysqlurl 数据库jdbc:mysql://localhost:3306/mybatis
public class Getparam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
ServletContext context = this.getServletContext();
String name = (String) context.getInitParameter("mysqlurl");
PrintWriter writer = resp.getWriter();
writer.println("get parameter = "+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// this.getInitParameter();
// this.getServletConfig()
}
}
运行结果
4.转发 getRequestDispatcher()
servletcontext对象 的getRequestDispatcher(path)函数可以转发网页
与重定向不同,转发会直接得到转发的网页,而不是让用户重新访问新网页
转发到上一个get parameter页面的gp路径
public class GetDispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
ServletContext context = this.getServletContext();
System.out.println("进入了getdispatcher");
context.getRequestDispatcher("/gp").forward(req ,resp);
// String charset ="GBK"; //假定编码格式
// String str = "中文";
//
// boolean flag = str.equals(new String(str.getBytes(),charset));
// System.out.println(flag);
// System.out.println("当前JRE:" + System.getProperty("java.version"));
// System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// this.getInitParameter();
// this.getServletConfig()
}
}
4.1中文乱码问题
中途遇到了控制台中文乱码的现象,System.out.println(“进入了getdispatcher”);中文无法显示
解决方案在上一篇文章,tomcat中文乱码文末
就是设置环境变量 JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
4.2运行结果 5.资源读取getResourceAsStream()中resource目录下资源在编译后会保存到target里的web项目的classes文件夹下
public class GetStreamProperties extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
Properties prop = new Properties();
prop.load(inputStreamReader);
String name = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().println(name+":"+pwd);
System.out.println(name+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// this.getInitParameter();
// this.getServletConfig()
}
}
4.1中文乱码问题
刚开始使用老师的方法
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
prop.load(inputStream);
会导致db.properties中的中文读取出来乱码
所以改成了
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
prop.load(inputStreamReader);
4.2运行结果



