本博客为这篇博客的辅助博客,主要是其中自己写的一些Demo.java代码


目录

Struts2_day02

Struts2框架中使用Servlet的API简介

demo1.jsp

success.jsp

Demo1Action.java

Demo2Action.java

struts.xml

页面跳转的配置

struts.xml1

struts.xml2

Demo3Action.java

Struts2数据封装Demo代码

demo2.jsp

User.java

struts.xml3

Regist1Action.java

Regist2Action.java

Regist3Action.java

Regist4Action.java

Regist5Action.java

案例:添加客户(简直太简单了现在)

add.jsp

CustomerAction.java

CustomerService.java

CustomerDao.java

Customer.java

struts.xml4

拦截器Demo代码

UserAction.java(用来测试的Action)

DemoInterceptor.java(自定义的拦截器)

struts.xml5(拦截器的配置方式1)

struts.xml6(拦截器的配置方式2)

案例二:使用拦截器判断用户是否已经登录

UserInterceptor.java

7struts.xml7

login.htm


Struts2_day02

Struts2框架中使用Servlet的API简介

demo1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'demo1.jsp' starting page</title></head><body><h3>演示Servlet的API的第一种方式(完全解耦合的方式,使用ServletContext类对象)</h3><form action="${ pageContext.request.contextPath }/demo1Action.action" method="post">姓名:<input type="text" name="username" /><br/>密码:<input type="password" name="password" /><br/><input type="submit" value="注册" /></form><hr><h3>演示ServletActionContext类的方法(最原始也最常用的方法)</h3><form action="${ pageContext.request.contextPath }/demo2Action.action" method="post">姓名:<input type="text" name="username" /><br/>密码:<input type="password" name="password" /><br/><input type="submit" value="注册" /></form></body>
</html>

success.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'seccess.jsp' starting page</title></head><body><h3>使用el表达式获取值</h3>不写前缀,默认最小的域中找: ${msg }<br>requestScope.msg: ${requestScope.msg }<br>sessionScope.msg: ${sessionScope.msg }<br>applicationScope.msg: ${applicationScope.msg }<br></body>
</html>

Demo1Action.java

package com.itheima.demo1;import java.util.Arrays;
import java.util.Map;
import java.util.Set;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/*** 完全解耦合的方式,使用servlet API* @author Administrator**/
public class Demo1Action extends ActionSupport{@Overridepublic String execute() throws Exception {//完全解耦合的方式ActionContext context = ActionContext.getContext();//获取到请求参数  封装所有的请求参数       Map<String, Object> map = context.getParameters();//遍历获取的数据Set<String> keys = map.keySet();//打印获取的参数for (String key : keys) {String[] vals = (String[]) map.get(key);System.out.println(key+":"+Arrays.toString(vals));}//获取其他map集合  context.getSession().put("msg", "云天河");//这就直接往session里存入值了context.getApplication().put("msg", "云天青");//这就直接往ServletContext里存入了一个值//往request里存入值context.put("msg", "柳梦璃");return SUCCESS;} }

Demo2Action.java

package com.itheima.demo1;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;/*** 原生的API* @author Administrator**/
public class Demo2Action extends ActionSupport{@Overridepublic String execute() throws Exception {//获取request对象HttpServletRequest request = ServletActionContext.getRequest();System.out.println(request.getParameter("username"));System.out.println(request.getParameter("password"));request.setAttribute("msg", "柳梦璃");request.getSession().setAttribute("msg", "云天河");//request.getSession().getServletContext().setAttribute("msg", "云天青");ServletActionContext.getServletContext().setAttribute("msg", "云天青");//获取responseHttpServletResponse response = ServletActionContext.getResponse();//可以使用输出流输出内容return SUCCESS;}}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="demo1" namespace="/" extends="struts-default"><!-- 完全解耦合的方式  调用默认方法--><action name="demo1Action" class="com.itheima.demo1.Demo1Action"><result name="success">/demo1/seccess.jsp</result></action><!-- 原生的方式 --><action name="demo2Action" class="com.itheima.demo1.Demo2Action"><result name="success">/demo1/seccess.jsp</result></action></package>
</struts>

页面跳转的配置

struts.xml1

(全局跳转页面,跳转类型:请求转发或重定向)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="demo1" namespace="/" extends="struts-default"><!-- 配置全局的跳转页面  无论哪个Action的return 只要name匹配上了 就可以跳转到此页面 --><!-- 一般登录页面可以配置为全局的 在本包(demo1)内有效--><global-results><!-- <result name="success" type="dispatcher">/demo1/seccess.jsp</result> --><result name="success" type="redirect">/demo1/seccess.jsp</result> <!-- 重定向 request域值传递不了了 --></global-results><!-- 完全解耦合的方式  调用默认方法--><action name="demo1Action" class="com.itheima.demo1.Demo1Action"><!-- <result name="success">/demo1/seccess.jsp</result> --></action><!-- 原生的方式 --><action name="demo2Action" class="com.itheima.demo1.Demo2Action"><!-- <result name="success">/demo1/seccess.jsp</result> --></action></package>
</struts>

struts.xml2

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="demo1" namespace="/" extends="struts-default"><!-- 演示重定向到Action --><action name="demo3Action_*" class="com.itheima.demo1.Demo3Action" method="{1}"><!-- 重定向到Action  注意跳转的Action的写法--><result name="success" type="redirectAction">demo3Action_update</result></action></package>
</struts>

Demo3Action.java

package com.itheima.demo1;import com.opensymphony.xwork2.ActionSupport;public class Demo3Action extends ActionSupport{public String save() {System.out.println("save.....");return SUCCESS;}//访问  /demo3Action_update.action => demo3Action_update(重定向配置这么多就够了)public String update() {System.out.println("update.....");return NONE;}}

Struts2数据封装Demo代码

demo2.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'demo2.jsp' starting page</title></head><body><h3>属性驱动方式封装数据</h3><form action="${ pageContext.request.contextPath }/regist1.action" method="post">姓名:<input type="text" name="username" /><br/>密码:<input type="password" name="password" /><br/>年龄:<input type="password" name="age" /><br/><input type="submit" value="注册" /></form><hr><!-- 超链接是get请求 --><h3>属性驱动方式封装数据(直接把数据封装到javabean对象中)</h3><!-- 注意1:页面的编写规则发生了变化,使用的OGNL表达式的写法  user.属性     写出user就知道去找对象属性了--><form action="${ pageContext.request.contextPath }/regist2.action" method="post">姓名:<input type="text" name="user.username" /><br/>密码:<input type="password" name="user.password" /><br/>年龄:<input type="password" name="user.age" /><br/><input type="submit" value="注册" /></form><hr><h3>模型驱动方式(前端还是正常写)</h3><form action="${ pageContext.request.contextPath }/regist3.action" method="post">姓名:<input type="text" name="username" /><br/>密码:<input type="password" name="password" /><br/>年龄:<input type="text" name="age" /><br/><input type="submit" value="注册" /></form><hr><h3>向List集合封装数据(默认情况下,采用的是属性驱动的方式)</h3><!-- 想达到的目的,封装成两个对象 放到list里   注意表单name的写法  其中list[0]是属性名--><form action="${ pageContext.request.contextPath }/regist4.action" method="post"><h3>用户1</h3>姓名:<input type="text" name="list[0].username" /><br/>密码:<input type="password" name="list[0].password" /><br/>年龄:<input type="text" name="list[0].age" /><br/><h3>用户2</h3>姓名:<input type="text" name="list[1].username" /><br/>密码:<input type="password" name="list[1].password" /><br/>年龄:<input type="text" name="list[1].age" /><br/><input type="submit" value="注册" /></form><hr><h3>向Map集合封装数据(默认情况下,采用的是属性驱动的方式)</h3><!-- 想达到的目的,封装成两个对象 放到list里   注意表单name的写法  map是属性名  key为字符串形式  值自己定--><form action="${ pageContext.request.contextPath }/regist5.action" method="post"><h3>用户1</h3>姓名:<input type="text" name="map['one'].username" /><br/>密码:<input type="password" name="map['one'].password" /><br/>年龄:<input type="text" name="map['one'].age" /><br/><h3>用户2</h3>姓名:<input type="text" name="map['two'].username" /><br/>密码:<input type="password" name="map['two'].password" /><br/>年龄:<input type="text" name="map['two'].age" /><br/><input type="submit" value="注册" /></form><hr></body></html>

User.java

package com.itheima.demo2;public class User {private String username;private String password;private String age;public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password+ ", age=" + age + "]";}public String getUsername() {return username;}}

struts.xml3

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <!-- 封装数据演示 --><package name="demo2" namespace="/" extends="struts-default"><!-- 属性驱动的方式 --><action name="regist1" class="com.itheima.demo2.Regist1Action"/><!-- 属性驱动的方式 (把数据封装到javabean对象中)--><action name="regist2" class="com.itheima.demo2.Regist2Action"/><!-- 模型驱动的方式 --><action name="regist3" class="com.itheima.demo2.Regist3Action"/><!-- 数据封装到list集合里 --><action name="regist4" class="com.itheima.demo2.Regist4Action"/><!-- 数据封装到map集合里 --><action name="regist5" class="com.itheima.demo2.Regist5Action"/></package></struts>

Regist1Action.java

(属性驱动,直接写一个个属性)

package com.itheima.demo2;import com.opensymphony.xwork2.ActionSupport;public class Regist1Action extends ActionSupport{//设置属性 只用给属性添加set方法  然后框架的拦截器就自动帮你封装好了,封装到了这些属性中private String username;private String password;private String age;public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public void setAge(String age) {this.age = age;}@Overridepublic String execute() throws Exception {System.out.println("用户名:"+username+" 密码:"+password+" 年龄:"+age);return NONE;}}

Regist2Action.java

(属性驱动方式,把数据封装到javaBean对象中  写javabean对象为属性)

package com.itheima.demo2;import com.opensymphony.xwork2.ActionSupport;/*** 属性驱动方式,把数据封装到javaBean对象中* @author Administrator**/
public class Regist2Action extends ActionSupport{//注意2:既然还是属性驱动方式,那么就要一个javaBean对象属性。并且现在要提供get和set方法    写好后数据就直接被封装到对象中了private User user=new User();//若自己主动new了对象 这初始化完数据就封装好了,此时set方法就没有存在价值了,不会被调用了public User getUser() {//其实getUser的作用是判断类是否实例化了,没有需要先帮你实例化//证明get和set都用了System.out.println("getUser");return user;}public void setUser(User user) {System.out.println("setUser");this.user = user;}@Overridepublic String execute() throws Exception {System.out.println(user);return NONE;}}

Regist3Action.java

(模型驱动 最简单常用  实现一个接口  前端正常写  后端Action实例化一个javabean对象为属性 不需要get/set)

package com.itheima.demo2;import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;/*** 模型驱动的方式*    1.实现ModelDriven接口*  2.手动实例化对象(需要自己new好)* @author Administrator**/
public class Regist3Action extends ActionSupport implements ModelDriven<User>{//必须手动实例化的private User user=new User();//获取模型对象@Overridepublic User getModel() {return user;//写好后 拦截器会调用这个必须实现的方法获取user对象,帮助你封装数据   多简单}@Overridepublic String execute() throws Exception {System.out.println("模型驱动:"+user);return NONE;}}

Regist4Action.java

(数据封装到list集合里)

package com.itheima.demo2;import java.util.List;import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;/*** 数据封装到list集合里*/
public class Regist4Action extends ActionSupport{//前端写好  属性list名字匹配  下面get/set写好  数据就自动封装了private List<User> list;public List<User> getList() {return list;}public void setList(List<User> list) {this.list = list;}@Overridepublic String execute() throws Exception {for (User user : list) {System.out.println(user);}return NONE;}}

Regist5Action.java

(数据封装到map集合里)

package com.itheima.demo2;import java.util.List;
import java.util.Map;import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;/*** 数据封装到map集合里*/
public class Regist5Action extends ActionSupport{private Map<String, User> map;public Map<String, User> getMap() {return map;}public void setMap(Map<String, User> map) {this.map = map;}@Overridepublic String execute() throws Exception {System.out.println(map);System.out.print("用户一的姓名:");User u1 = map.get("one");System.out.println(u1.getUsername());return NONE;}}

案例:添加客户(简直太简单了现在)

add.jsp

(简单前端列表)

<FORM action="${pageContext.request.contextPath }/customer_save.action" method=post><TABLE cellSpacing=0 cellPadding=0 width="98%" border=0><TBODY><TR><td>客户名称:</td><td><INPUT class=textbox maxLength=50 name="cust_name"></td><td>客户级别 :</td><td><INPUT class=textbox maxLength=50 name="cust_level"></td></TR><TR>                             <td>信息来源 :</td><td><INPUT class=textbox maxLength=50 name="cust_source"></td><td>联系人:</td><td><INPUT class=textbox  maxLength=50 name="cust_linkman"></td></TR><TR>                     <td>固定电话 :</td><td><INPUT class=textbox  maxLength=50 name="cust_phone"></td><td>移动电话 :</td><td><INPUT class=textbox maxLength=50 name="cust_mobile"></td></TR><TR><td>联系地址 :</td><td><INPUT class=textbox  maxLength=50 name="cust_address"></td><td>邮政编码 :</td><td><INPUT class=textbox  maxLength=50 name="cust_zip"></td></TR><TR><td>客户传真 :</td><td><INPUT class=textbox  maxLength=50 name="custFax"></td><td>客户网址 :</td><td><INPUT class=textbox  maxLength=50 name="custWebsite"></td></TR><tr><td rowspan=2><INPUT class=button type=submit    value=" 保存 " name=sButton2></td></tr></TBODY></TABLE>
</FORM>

CustomerAction.java

(客户控制器)

package com.itheima.action;import com.itheima.domain.Customer;
import com.itheima.service.CustomerService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;/*** 客户的控制器* @author Administrator**/                                                                       //这个Action都是关于客户的操作
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{//千万注意必须要手动实例化一个对象    差点忘了private Customer customer=new Customer();//对customer的添加,修改,不论什么功能,一提交就帮你封装了@Overridepublic Customer getModel() {return customer;}/*** 保存客户* @return*/public String save(){//保存客户new CustomerService().saveCustomer(customer);//简直不要太简单   仔细看看3层  太简单了  全是调用save  ssm岂不是更简单了,哈哈哈哈哈或return null;}}

CustomerService.java

package com.itheima.service;import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;import com.itheima.dao.CustomerDao;
import com.itheima.domain.Customer;
import com.itheima.utils.HibernateUtils;/*** 客户的业务层* @author Administrator**/
public class CustomerService {/*** 保存客户* @param customer*/public void saveCustomer(Customer customer){Session session = HibernateUtils.getCurrentSession();Transaction tr = session.beginTransaction();try {//调用dao层new CustomerDao().save(customer);tr.commit();} catch (Exception e) {tr.rollback();e.printStackTrace();}      }/*** 测试方法*/@Testpublic void run1(){Customer c = new Customer();c.setCust_name("张三");saveCustomer(c);}}

CustomerDao.java

package com.itheima.dao;import org.hibernate.Session;import com.itheima.domain.Customer;
import com.itheima.utils.HibernateUtils;public class CustomerDao {/*** 持久层保存客户* @param customer*/public void save(Customer customer){Session session = HibernateUtils.getCurrentSession();session.save(customer); }}

Customer.java

package com.itheima.domain;public class Customer {private Long cust_id;private String cust_name;private Long cust_user_id;private Long cust_create_id;private String cust_source;private String cust_industry;private String cust_level;private String cust_linkman;private String cust_phone;private String cust_mobile;public Long getCust_id() {return cust_id;}public void setCust_id(Long cust_id) {this.cust_id = cust_id;}public String getCust_name() {return cust_name;}public void setCust_name(String cust_name) {this.cust_name = cust_name;}public Long getCust_user_id() {return cust_user_id;}public void setCust_user_id(Long cust_user_id) {this.cust_user_id = cust_user_id;}public Long getCust_create_id() {return cust_create_id;}public void setCust_create_id(Long cust_create_id) {this.cust_create_id = cust_create_id;}public String getCust_source() {return cust_source;}public void setCust_source(String cust_source) {this.cust_source = cust_source;}public String getCust_industry() {return cust_industry;}public void setCust_industry(String cust_industry) {this.cust_industry = cust_industry;}public String getCust_level() {return cust_level;}public void setCust_level(String cust_level) {this.cust_level = cust_level;}public String getCust_linkman() {return cust_linkman;}public void setCust_linkman(String cust_linkman) {this.cust_linkman = cust_linkman;}public String getCust_phone() {return cust_phone;}public void setCust_phone(String cust_phone) {this.cust_phone = cust_phone;}public String getCust_mobile() {return cust_mobile;}public void setCust_mobile(String cust_mobile) {this.cust_mobile = cust_mobile;}public static void main(String[] args) {System.out.println("hello");}@Overridepublic String toString() {return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name+ ", cust_user_id=" + cust_user_id + ", cust_create_id="+ cust_create_id + ", cust_source=" + cust_source+ ", cust_industry=" + cust_industry + ", cust_level="+ cust_level + ", cust_linkman=" + cust_linkman+ ", cust_phone=" + cust_phone + ", cust_mobile=" + cust_mobile+ "]";}}

struts.xml4

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="crm" namespace="/" extends="struts-default"><!-- 客户模块 --><action name="customer_*" class="com.itheima.action.CustomerAction" method="{1}"><!-- 应该转到Action获取列表 type="chain" redirectAction --><result name="success">/jsp/customer/list.jsp</result></action>        </package></struts>

拦截器Demo代码

UserAction.java(用来测试的Action)

package com.itheima.demo3;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{@Overridepublic String execute() throws Exception {System.out.println("我是Action,我正常的执行...");return NONE;}
}

DemoInterceptor.java(自定义的拦截器)

package com.itheima.interceptor;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/*** 编写简单的拦截器* @author Administrator*/
public class DemoInterceptor extends AbstractInterceptor{/*** intercept用来进行拦截的 也即执行Action方法之前,它会执行*/@Overridepublic String intercept(ActionInvocation invocation) throws Exception {System.out.println("Action方法执行之前!");//执行下一个拦截器String result = invocation.invoke();System.out.println("Action方法执行之后!");//必须返回执行结果  才能继续执行下一个return result;} }

struts.xml5(拦截器的配置方式1)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="demo3" namespace="/" extends="struts-default"><!-- 系统有一大堆拦截器会自动执行,自己写的拦截器想执行必须配置 下面是一种方法 --><interceptors>          <!-- name可以随便写 --><!-- 定义拦截器  (说明下面还有引用此拦截器的配置) --><interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"></interceptor></interceptors><action name="userAction" class="com.itheima.demo3.UserAction"><!-- 只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈(否则框架的一些功能如数据封装就用不了了) --><interceptor-ref name="DemoInterceptor"/><interceptor-ref name="defaultStack"/></action></package></struts>

struts.xml6(拦截器的配置方式2)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="demo3" namespace="/" extends="struts-default"><!-- 第二种方式:定义拦截器栈 --><interceptors> <!-- 先定义自己的拦截器(有后端拦截器代码) --><interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/><!-- 再定义拦截器栈 --><interceptor-stack name="myStack"><interceptor-ref name="DemoInterceptor"/> <!-- 先执行的拦截器 --><interceptor-ref name="defaultStack"/>    <!-- 后执行的拦截器 --></interceptor-stack></interceptors><action name="userAction" class="com.itheima.demo3.UserAction"><!-- 引入拦截器栈就OK --><interceptor-ref name="myStack"/></action></package>
</struts>

案例二:使用拦截器判断用户是否已经登录

UserInterceptor.java

(拦截器)

package com.itheima.interceptor;import javax.servlet.http.HttpSession;import com.itheima.domain.User;
import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/*** 自定义拦截器 判断当前用户是否登录*  若已登录:正常执行*  若未登录:跳到登录页面* @author Administrator* *  若继承:AbstractInterceptor类 会什么方法都拦截 不合适**/
public class UserInterceptor extends MethodFilterInterceptor{/*** 进行拦截*/protected String doIntercept(ActionInvocation invocation) throws Exception {//获取session对象User user = (User) ServletActionContext.getRequest().getSession().getAttribute("exitsUser");if(user==null){//说明没有登录return "login";}return invocation.invoke();//放行  让它执行下一次的过滤}}

7struts.xml7

(配置拦截器)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="crm" namespace="/" extends="struts-default"><!-- 配置拦截器   下面每个Action都要引入--><interceptors><interceptor name="UserInterceptor" class="com.itheima.interceptor.UserInterceptor"></interceptor></interceptors><!-- 配置全局跳转页面 在本包(crm)内有效--><global-results><result name="login">/login.htm</result></global-results><!-- 配置用户模块action -->         <!-- 通配符法真不错! --><action name="user_*" class="com.itheima.action.UserAction" method="{1}"><result name="login">/login.htm</result><result name="success">/index.htm</result><interceptor-ref name="UserInterceptor"><!-- userAction的login方法不拦截  --><param name="excludeMethod">login</param><!-- 就是配置一个javaBean属性的值 --></interceptor-ref><interceptor-ref name="defaultStack"/></action><!-- 客户模块 --><action name="customer_*" class="com.itheima.action.CustomerAction" method="{1}"><!-- 应该转到Action获取列表 type="chain" redirectAction --><result name="success">/jsp/customer/list.jsp</result><interceptor-ref name="UserInterceptor"/><interceptor-ref name="defaultStack"/></action></package>    </struts>

login.htm

(前端login框架要改下)

<FORM id=form1 name=form1 action="/day32_crm/user_login.action" method=post target="_parent"> <!-- 注意target="_parent"  否则框架在子窗口打开,页面重复了 -->......
</FORM>

struts2_day02 Demo代码相关推荐

  1. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)

    Java框架JSON-RPC项目demo代码实战 备注  JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...

  2. WP7开发—Silverlight多点触摸事件详解【含Demo代码】

    最近在学习WP7的Silverlight编程,就把学习到知识点整理为日志,方便自己理解深刻点,也作为笔记和备忘,如有不合理或者错误之处,还恳请指正. WP7的支持多点触摸,有两种不同的编程模式: 1. ...

  3. 免费资源 | ActiveReports 报表控件发布多平台 Demo 代码集合

    近期,ActiveReports 产品开发组的小伙伴针对大家比较关注的报表功能.常见问题.经典实现,特意准备了一个Demo代码集合,涉及WinFormss \ ASP.NET \ MVC 多个技术平台 ...

  4. 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享...

    超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享 DI框架 Google-Guice入门介绍 转载于:https://www.cnblogs.com ...

  5. java中thread实例_Java多线程并发执行demo代码实例

    主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...

  6. TCC Demo 代码实现

    TCC Demo 代码实现 简介     设计实现一个 TCC 分布式事务框架的简单 Demo,实现事务管理器,不需要实现全局事务的持久化和恢复.高可用等 工程运行 工程地址:TCCDemo      ...

  7. Android 后台发送邮件 (收集应用异常信息+Demo代码)

    Android 后台发送邮件 (收集应用异常信息+Demo代码) 参考文章: (1)Android 后台发送邮件 (收集应用异常信息+Demo代码) (2)https://www.cnblogs.co ...

  8. RAD Studio 10 自带Demo代码汇总说明

    来源:https://www.cnblogs.com/findumars/p/5149128.html 大家好,好多朋友来信咨询Delphi和C++Builder的移动开发.DataSnap架构等问题 ...

  9. demo代码目录整理

    文章目录 Demo代码 介绍 码云地址 Qt代码 Qxlsx报表测试代码 QPainter+QPrinter报表测试代码 tcpClient tcp客户端demo 百度地图调用demo 9宫格图案手势 ...

最新文章

  1. 一天三场签约,百度Apollo智能交通这速度,真快!
  2. ACM-ICPC 2018 徐州赛区网络预赛 Features Track(STL二维map)
  3. Eclipse添加Spket插件实现ExtJs智能提示
  4. Web攻防之XSS,CSRF,SQL注入
  5. android struts2 图片上传,xhEditor struts2实现图片上传
  6. 9.jsonp的实现原理
  7. 人不能活在舒适区里,我要趁年轻出去闯闯
  8. Scikit-learn:scikit-learn快速教程及实例
  9. 调用 ogc_area 时参数个数或类型错误_Python10函数参数
  10. 面试字节、阿里等大厂后,总结了今年的 Java 面试必问的微服务面试题(含答案)
  11. 读书笔记202208 TRC2010 Multi-agent model predictive control of signaling split in urban traffic networks
  12. eclipse打包java_eclipse实现将Java项目打包成jar包
  13. Windows11 下屏幕亮度自动调整的问题解决
  14. 仿最新BiliBili客户端(已开源)
  15. 兔年新春,快来领取你的春节全屏动效吧
  16. 【深度学习】深度学习入门:投身深度学习你需要哪些准备?
  17. RTX 4070TI和RTX 4090性能差距 RTX4070ti和4070区别对比
  18. 浅谈Android相机演变
  19. java走棋_Java五子棋小游戏(控制台纯Ai算法)
  20. java全角空格转换半角空格

热门文章

  1. OSChina 周三乱弹 ——我把你们当学生,而你们却想上我
  2. GO map(集合)
  3. K12教育产品竞品分析(VIPKID、DaDaABC) PPT
  4. 研究下“花呗”到底该不该用?
  5. 算法分析与设计课程复习之回溯法
  6. 谣言检测论文精度——14.2019-Jointly embedding the local and global relations of heterogeneous graph
  7. SEO:必须登录才能查看文章或者文章列表,实则也是阻挡蜘蛛
  8. 精讲▍自然语言处理浅谈 技术/工具/方法和应用全都有了
  9. lims实验室管理系统如何提高工作效率
  10. 魔法成为现实?武大学生团队造出了“隐身衣”,成本不到 500 元!