4. Mapping问题
4.1 一个Servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
4.2 一个Servlet可以指定多个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping>
4.3 一个Servlet可以指定通用映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
4.4 默认请求路径
<!-- 默认请求路径。这个少用--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
4.5 指定一些后缀或者前缀等等…
<!-- 可以自定义后缀实现请求映射。注意:*前面不能加项目映射的路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.hxl</url-pattern> </servlet-mapping>
4.6 优先级问题
指定的固有的映射路径优先级最高,如果找不到会找默认的处理请求。
<!-- 注册Servlet --> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.hxl.servlet.ErrorServlet</servlet-class> </servlet> <!-- Servlet的请求路径 --> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
5. ServletContext
web容器容器中的溶剂或易燃化学品在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
5.1 共享数据
- 我在这个Servlet中保存的数据,可以在另外一个Servlet中找到
放置数据的类
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //this.getInitParameter() 初始化参数 //this.getServletConfig() Servlet配置 //this.getServletContext() Servlet上下文 ServletContext context = this.getServletContext(); String username = "hxl"; //如果这里的值是中文,就要注意编码和响应 context.setAttribute("username",username); //将一个数据保存在了ServletContext中,名字为username,值为username } }
读取它的类
public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String username = (String) context.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字" + username); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
配置它的xml
<servlet> <servlet-name>getc</servlet-name> <servlet-class>com.hxl.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getc</servlet-name> <url-pattern>/getc</url-pattern> </servlet-mapping>
测试访问结果
如果没有设置编码会出现两个问号java语言3;null。设置之后就会出现
设置过后容器xff0c;直接访问getc还是控制,这是因为还没有进行存,我们先访问一下hello这个页面,进行存取&容器技术#xff0c;hello这容器苗个页面是空的。不管它,然后再访问getc会小毛驴简谱发现结果出来了。
5.2 获取初始化参数
在web.xml中配置
<!--配置web应用初始化参数--> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param>
取的位置
public class ServletDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String url = context.getInitParameter("url"); resp.getWriter().print(url); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
在web.xml中配置
<servlet> <servlet-name>gp</servlet-name> <servlet-class>com.hxl.servlet.ServletDemo03</servlet-class> </servlet> <servlet-mapping> <servlet-name>gp</servlet-name> <url-pattern>/gp</url-pattern> </servlet-mapping>
5.3 请求转发
public class ServletDemo04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); System.out.println("进入了ServletDemo04"); /* RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径 requestDispatcher.forward(req,resp); //调用forward实现请求转发 */ //上面两句合并之后 context.getRequestDispatcher("/gp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<servlet> <servlet-name>sd4</servlet-name> <servlet-class>com.hxl.servlet.ServletDemo04</servlet-class> </servlet> <servlet-mapping> <servlet-name>sd4</servlet-name> <url-pattern>/sd4</url-pattern> </servlet-mapping>
另一种方法是重定向,A问B要拿C的资源,B告诉A去找C拿,然后A再去找C
5.4 读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下新建pjava环境变量配置roperties
发java模拟器现都被打包到同一个路径下:classes,我们俗称这个路径为classpath;
public class ServletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("WEB-INF/classes/db.properties");//把资源变成流,最开始的/不能省略他表示当前web项目 。这个地方如果报500就是位置错误,修改值加个/ 我是加了报错,我就删掉了 Properties prop = new Properties(); prop.load(is); String username = prop.getProperty("username"); String password = prop.getProperty("password"); resp.getWriter().print(username + ":" + password); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
在xml文件下配置请求路径
测试java面试题结果:
发表评论