JavaWeb基础(七)JSP基础 上

1、显示注释<!--  -->、隐式注释<%--  --%>、<% //单行 %>、<% /* 多行*/ %>、定义局部变量编写语句<%%>、全局变量<%!%>、输出【不需要用分号结尾】<%= %>

2、page指令import导入jar包,contentType中charset设置服务器发送给客户端的内容编码,而pageEncoding设置的是jsp文件本身的编码【jsp编码一般先有pageEncoding决定,没有则由contentType中的charset决定,也没有则默认IOS-8859-1,一般开发只需使用pageEncoding设置编码即可】

3、服务端跳转地址栏地址不变,如果提交页面数据使用该方式要注意可能二次提交问题,执行到跳转语句立刻跳转要注意资源回收客户端跳转地址栏的改变,页面间的传值要注意内置对象的使用范围执行完整个页面才跳转

4、错误页的设置:

  • 在测试页面将page指令中的errorPage指定错误页面,在错误页面将page指令中的isErrorPage属性值设置为true。错误页跳转属于服务端跳转。同时,还可以在html结构里面加上<meta http-equiv="refresh" content="5; url=index.jsp">这句,在错误页面5秒钟以后自动跳回首页。
  • 修改该项目的web.xml文件,如:
    <!--状态码-->
    <error-page>
      <error-code>500</error-code>
      <location>error1.jsp</location>
    </error-page>
    <error-page>
      <error-code>404</error-code>
      <location>error2.jsp</location>
    </error-page>
    
    <!--空指向异常-->
    <error-page>
      <exception-type>java.lang.NullPointerException</exception-type>
      <location>error3.jsp</location>
    </error-page>

     

5、包含时应注意在每一个完整的页面中,有些元素只能出现一次,比如<html></html><head></head><title></title><body></body>等。

  • 静态包含:将被包含文件先导入包含文件,然后再一起进行编译,再将一份整体内容呈现出来
  • 动态包含:自动分别被包含文件是静态还是动态,如果被包含文件是静态如上处理,如果被包含文件是动态,先进行动态处理,再将被包含文件处理的结果导入包含文件。
  • 举例,如果被包含文件和包含文件都定义了一个不同的x值,在静态包含中将报错,因为是一起进行编译会有重复定义的错误,而在动态包含中则不会,因为它们处理的顺序不一致。
    <!--静态包含-->
    
    <@include file="include.jsp">
    
    
    <!--动态包含,可以传参-->
    
    String path="include.jsp";
    
    //<jsp:include page="<%=path%>" flush="true"/>
    
    <jsp:include page="<%=path%>" flush="true">
    <jsp:param name="username" value="lplp"/>
    ...
    </jsp:include>
    

     

6、页面跳转指令,属于服务器跳转

<%--不传参--%>
<jsp:forward page="{forward.jsp}"/>

<%--传参--%>
<jsp:forward page="{forward.jsp}">
<jsp:param name="username" value="lplp"/>
...
</jsp:forward>

7、使用response内置对象跳转,属于客户端跳转,使用时前面不能有html输出

response.sendRedirect("xxx.html");

response.setHeader("refresh","0;URL=xxx.html");

8、RequestDispatcher.forward(),通常在servlet中使用,在服务器端起作用,当使用forward()时,传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即form使用post或者get提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有参数属性在 b.jsp都可以获得,参数自动传递。但是,传递地址的写法不能带参数,而是在程序内通过response.setAttribute("name",name)来传至下一个页面,重定向后浏览器地址栏URL不变。

public void doPost(HttpServletRequest request,HttpServletResponse response) 
throws ServletException,IOException
{
  ServletContext sc = getServletContext();
  RequestDispatcher rd = null;
  rd = sc.getRequestDispatcher("/xxx.jsp"); 
  rd.forward(request, response);
}

9、jsp提供了九大内置对象,容器自动进行实例化,直接使用,有pageContext【jsp页面容器】、request【得到用户请求信息】、response【服务器向客户端回应】、session【存取一次会话,即用户信息】、application【所有用户共享信息】、config【服务器配置,可以得到初始化参数】、out【页面输出】、page【从页面表示出来的一个servlet实例】、exception【表示jsp页面发生的异常,在错误页起作用】

10、pageContext,一般是page范围,跳转以后无法获得,一般使用getAttribute和setAttribute方法创建和读取。

pageContext.setAttribute("name","lplplp");//创建
String name=pageContext.getAttribute("name");//获取

还有一种用法是使用它设置四个属性范围,使用较少,大致用法大概是,pageContext.setAttribute("name","lplplp",PAGE/REQUEST/SESSION/APPLiCATION_SCOPE【1、2、3、4】);

11、request,request范围,服务器跳转后,属性和属性值依然可以保留下来,一次请求,使用方法也类似pageContext,但是客户端跳转无法使用,比如超链接跳转后就无法获得,因为内部发送了二次请求。

  • 涉及编码,在页面编码仍然解决不了的情况下,可以在获取属性值前面加上,如request.setCharacterEncoding("utf-8");等。
  • 接收表单的http请求参数可以使用getParamter("xxx")【单一值,如文本框内容】或者getParamterValues("xxx")【一组值,如复选框】,甚至使用getParamterNames("xxx")接收所有参数,可以参考我的另一篇博客:https://blog.csdn.net/qq_37575994/article/details/84928338
  • 也可以拿到头信息,比如IP、Cookie等,全部头信息getHeaderNames(),单个getHeader。如下:
<%
Enumeration<String> headers=request.getHeaderNames();
while(headers.hasMoreElements()){
	String header=headers.nextElement();
%>
	<%=header+":"+request.getHeader(header)%>
	<br/>
<%
}
%>
  • 角色验证,举一个tomcat已经存在的例子,在conf文件夹里面找到tomcat-users.xml,打开即可看到被注释的示例,一般来说,tomcat原始默认网站的右边三排按钮,没有设置角色的时候,点击Manager App这个灰色按钮会弹出一个角色验证的对话框,如果我去刚才那个文件,被在那个.xml结束标签之前添加,<role rolename="manager-gui"/>
    <user username="tomcat" password="tomcat" roles="manager-gui"/>即可输入账户和密码tomcat进入http://localhost:8080/manager/html了。自己创建的步骤则是:
  1. 在conf文件夹里面找到tomcat-users.xml,按照被注释实例提供的例子创建一个角色,包含用户名,密码,所属角色,比如:<user username="lp" password="lp" roles="lpadmin"/>
  2. 配置完成后,修改web.xml内容为,我这里写的是两个角色的,一个角色把标了其他的删掉,各种参数改成对应内容即可:
    <security-constraint>
        <web-resource-collection>
          <web-resource-name>限制访问的名称</web-resource-name>
          <url-pattern>限制访问的路径,如/项目名/demo.jsp</url-pattern>
        </web-resource-collection>
        <auth-constraint>
           <role-name>设置的role-name,如我刚刚写的lpadmin</role-name>
           <role-name>其他的</role-name>
        </auth-constraint>
      </security-constraint>
      
    <login-config>
        <auth-method>BASIC</auth-method><!--弹窗方式-->
        <realm-name>验证中使用的领域名称</realm-name>
      </login-config>
    
    
    <security-role>
        <role-name>指定用于安全约束中角色的声明,如我刚刚写的lpadmin</role-name>
      </security-role>
    <security-role>
        <role-name>其他的</role-name>
      </security-role>

     

  • 其他操作,比如getMethod【get/post】,getRemoteAddr【IP地址】,getServletPath【访问路径】,getContextPath【上下文资源名称】

12、session,session范围,在一次会话中,即使用同一个浏览器,不管客户端服务端跳转均有效,多用来做验证登录,创建取出使用方法也类似pageContext,同时还有getId()【取得SessionID】、getCreationTime()【创建Session时间】getLastAccessedTime()【最后操作时间】isNew()【判断新用户】invalidate()【让Session失效】getAttributeNames()【得到所有属性名称,Enumeration类型】。

13、application,application范围,同一个服务器,所有用户共享,除非服务器重启,不过设置过多会影响服务器性能。同时还有getRealPath()【虚拟目录对应的绝对路径】,getAttributeNames()、getContextPath()【虚拟目录】等方法。顺便提下虚拟目录的设置方法:打开tomcat安装目录,找到conf/server.xml,在host标签结束前加上<Context path="虚拟目录" docBase="真实文件位置" />

14、response主要有addCookie【增加cookie,不支持中文】、setHeader【设置头信息】、sendRedirect【页面跳转,客户端】等几个方法

  • 参考上面第7点,看一下设置头信息和页面跳转,还可以写response.setHeader("refresh","2");不需要跳转。当页面没有jsp代码一般使用在html里面设置头信息的方法,如:<meta http-equiv="refresh" content="5; url=xxx.jsp">而且还能使用设置头信息的方法设置cookie:response.setHeader("Set-Cookie","lp=soupsome.cn");
  • 虽然安全性差且一个客户端最多保存300个,但是Cookie可以提高网页效率减少服务器负载。通过respose可以增加Cookie,而通过request可以取得Cookie。如:
//增加
Cookie c1=new Cookie("lp","lplp");
c1.setMaxAge(60);//保存60秒
Cookie c2=new Cookie("zz","zzzz");
c2.setMaxAge(60);
//Cookie不能存储中文
String nameValue = URLEncoder.encode("南昌", "utf-8");
Cookie c3=new Cookie("name",nameValue);
c3.setMaxAge(60);
response.addCokie(c1);//向客户端增加Cookie
response.addCokie(c2);
response.addCokie(c3);

//取出
String name=null;
String value=null;
Cookie[] c=request.getCookie();//取得全部Cookie
for(int i=0;i<c.length;i++){   
 System.out.print(URLDecoder.decode(c[i].getName())+""+URLDecoder.decode(c[i].getValue());//控制台打印每一个
   if (cookie.getName().equals("lp")){//找到名字为lp的打印指定信息
               System.out.print("找到了!");
   }

}

15、config,取得初始化配置信息,主要方法有getInitParameter()和getInitParameterNames(),都需要在web.xml中完成映射。Web目录中的WEB-INF文件夹是安全性最高的,外界一般访问不了,但是,如果希望外面仍然可以访问,那么可以通过映射,类似servlet里面的写法。比如,将一个叫demo.jsp的文件放在WEB-INF里面,通过demo即可访问它,记得重启tomcat.

<servlet>
	<servlet-name>itsName</servlet-name>
	<jsp-file>/WEB-INF/demo.jsp</jsp-file>
 </servlet>
 <servlet-mapping>
	<servlet-name>itsName</servlet-name>
	<url-pattern>/demo</url-pattern>
 </servlet-mapping>

16、pageContext对象可以页面跳转forward【支持url地址上携带参数】,页面包含include,取得其他五种对象。

17、JavaBean应该具备以下要求:

  1. 所以类放在包中
  2. 所有的类必须声明为public
  3. 所有属性必须封装,即为private
  4. 封装属性需要被外界操作,应该有对应的get和set方法
  5. 至少存在一个无参构造方法

18、导入使用JavaBean的方法:

<%@ page import="com.demo.UserBean" %>

...

<%
UserBean user=new UserBean();
user.set...();
%>

<%=user.get...()%>
...

19、使用<jsp:useBean>指令,每次修改需要重启服务器,但是也可以在虚目录里面设置自动加载,添加reloadable=true语句

  1. 指令的格式<jsp:useBean id="名字" scope="保存范围【page/request/session/application】" class="包名.类名"/>
  2. 指定设置属性的参数:<jsp:setProperty name="上面id的名字" property="javabean对象的属性" param="表单的属性名字">,数据类型可以自动转化;为属性设置具体的参数:<jsp:setProperty name="上面id的名字" property="javabean对象的属性" value="想设置的值">;自动匹配,如果javabean对象的属性和表单的属性名字一致,可以使用<jsp:setProperty name="上面id的名字" property="*" >;指定属性,如果只想匹配个别属性且javabean对象的属性和表单的属性名字一致,可以使用<jsp:setProperty name="上面id的名字" property="javabean对象的属性">
  3. 获取:<jsp:getProperty name="上面id的名字" property="javabean对象的属性" >

20、文件上传,组件自行学习感受吧,什么时候想贴代码再贴一波代码,电脑里好像没有demo,只是在微信小程序里写过一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值